0

我有一个大型的飞行腿数据集,我想根据图表的权重是特定腿的飞行次数来构建一个图表。一条腿中涉及的城市对存储为集合列表。我无法创建计数/频率字典,因为“集合不可散列”

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

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

4

2 回答 2

1

如果将集合转换为元组,则可以Counter直接在输入数据上使用 a。然后,您可以使用列表推导将其转换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})
]
于 2021-03-26T01:25:06.957 回答
1

用于frozenset获取可散列集。

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

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

    my_out = Counter(frozenset(leg) for leg in my_concat_list)
    
于 2021-03-26T01:31:32.777 回答