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

Frequency or Count of a list of sets in Python

我有一个大的航段数据集,我想构建一个图表,其中图表的权重是特定航段的飞行次数。腿中涉及的城市对存储为集合列表。我在创建 count/frequency 字典时遇到问题,因为“集合不可散列”

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:

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}) ]

这就是我所做的,看起来很可怕。

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 看起来像这样:

 [';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']

我使用计数器来获取频率。

from collections import Counter
my_out = Counter(my_concat_list)

我得到的输出是:

Counter({';DOHA;ROME': 4,
         ';JAKARTA;DOHA': 3,
         ';ROME;MAURITIUS': 2,
         ';JAKARTA;ROME': 1,
         ';WASHINGTON, DC;NEW YORK   NY': 1,
         ';ACCRA;WASHINGTON, DC': 1})

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

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 的样子:

[('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})]

但是必须有更好的方法来做到这一点。这看起来真的很笨拙。

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

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)

输出:

[
 ('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})
]

使用 frozenset 获取可哈希集。

  • 很可能您可以修改生成它们的代码;将 set 替换为 frozenset 可能会成功。

  • 如果不能直接生成frozenset,可以转换一下:

    my_out = Counter(frozenset(leg) for leg in my_concat_list)