首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中集合列表的频率或计数

Python中集合列表的频率或计数
EN

Stack Overflow用户
提问于 2021-03-26 01:11:04
回答 2查看 259关注 0票数 0

我有一个大型的飞行腿数据集,我想要构建一个图表,图的权重是某一条腿飞行的次数。涉及到一条腿的城市对被存储为一组集合。我在创建一个计数/频率字典时遇到了困难,因为“集合是不可理解的”。

代码语言:javascript
复制
my_test_list = [{'DOHA', 'ROME'},{'DOHA', 'JAKARTA'},{'DOHA', 'JAKARTA'},{'DOHA', 'ROME'},{'MAURITIUS','ROME'},{'MAURITIUS', 'ROME'},{'DOHA', 'ROME'},{'DOHA', 'JAKARTA'},{'JAKARTA', 'ROME'}, {'DOHA', 'ROME'},{'NEW YORK   NY', 'WASHINGTON, DC'},{'ACCRA', 'WASHINGTON, DC'}]

理想情况下,我希望有这样一个输出,可以输入到networkx中:

代码语言:javascript
复制
edge_list = [('DOHA', 'ROME', {'frequency': 4}), ('DOHA', 'JAKARTA', {'frequency': 3}),('MAURITIUS', 'ROME', {'frequency': 2}), ('ROME', 'JAKARTA', {'frequency': 1}),('NEW YORK   NY', 'WASHINGTON, DC', {'frequency': 1}),('ACCRA', 'WASHINGTON, DC', {'frequency': 1}) ]

这就是我所做的,似乎是可怕的。

代码语言:javascript
复制
my_concat_list=[]
for item in my_test_list:
    out=""
    while len(item) !=0:
        out=out+";"+item.pop()
    my_concat_list.append(out)

my_concat_list最后看起来是这样的:

代码语言:javascript
复制
 [';DOHA;ROME',
 ';JAKARTA;DOHA',
 ';JAKARTA;DOHA',
 ';DOHA;ROME',
 ';ROME;MAURITIUS',
 ';ROME;MAURITIUS',
 ';DOHA;ROME',
 ';JAKARTA;DOHA',
 ';JAKARTA;ROME',
 ';DOHA;ROME',
 ';WASHINGTON, DC;NEW YORK   NY',
 ';ACCRA;WASHINGTON, DC']

我用计数器来获取频率。

代码语言:javascript
复制
from collections import Counter
my_out = Counter(my_concat_list)

我得到的输出是:

代码语言:javascript
复制
Counter({';DOHA;ROME': 4,
         ';JAKARTA;DOHA': 3,
         ';ROME;MAURITIUS': 2,
         ';JAKARTA;ROME': 1,
         ';WASHINGTON, DC;NEW YORK   NY': 1,
         ';ACCRA;WASHINGTON, DC': 1})

从这里,我可以得到我想要的最终格式:

代码语言:javascript
复制
my_final_list=[]
for item in my_out.keys():
    temp_list = item.split(";")
    weight = my_out[item]
    my_new_tuple = (temp_list[1],temp_list[2],{'frequency':weight})
    my_final_list.append(my_new_tuple)
my_final_list

这就是my_final_list的样子:

代码语言:javascript
复制
[('DOHA', 'ROME', {'frequency': 4}),
 ('JAKARTA', 'DOHA', {'frequency': 3}),
 ('ROME', 'MAURITIUS', {'frequency': 2}),
 ('JAKARTA', 'ROME', {'frequency': 1}),
 ('WASHINGTON, DC', 'NEW YORK   NY', {'frequency': 1}),
 ('ACCRA', 'WASHINGTON, DC', {'frequency': 1})]

但一定有更好的方法。这看起来真的很笨重。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-26 01:25:06

如果将集合转换为元组,则可以直接对输入数据使用Counter。然后,可以使用列表理解将Counter转换为所需的格式:

代码语言:javascript
复制
from collections import Counter

my_test_list = [{'DOHA', 'ROME'},{'DOHA', 'JAKARTA'},{'DOHA', 'JAKARTA'},{'DOHA', 'ROME'},{'MAURITIUS','ROME'},{'MAURITIUS', 'ROME'},{'DOHA', 'ROME'},{'DOHA', 'JAKARTA'},{'JAKARTA', 'ROME'}, {'DOHA', 'ROME'},{'NEW YORK   NY', 'WASHINGTON, DC'},{'ACCRA', 'WASHINGTON, DC'}]

counts = Counter(tuple(s) for s in my_test_list)

result = [k + ({ 'frequency' : v },) for k, v in counts.items()]
print(result)

输出:

代码语言:javascript
复制
[
 ('DOHA', 'ROME', {'frequency': 4}),
 ('DOHA', 'JAKARTA', {'frequency': 3}),
 ('ROME', 'MAURITIUS', {'frequency': 2}),
 ('ROME', 'JAKARTA', {'frequency': 1}),
 ('WASHINGTON, DC', 'NEW YORK   NY', {'frequency': 1}),
 ('WASHINGTON, DC', 'ACCRA', {'frequency': 1})
]
票数 1
EN

Stack Overflow用户

发布于 2021-03-26 01:31:32

使用frozenset获得一个可选集。

  • 很可能您可以修改生成它们的代码;用frozenset替换set可能会奏效。

如果不能直接生成

  • ,则可以转换它们:

my_concat_list)中的my_out =计数器(用于腿的frozenset(腿))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66809690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档