我有一个大型的飞行腿数据集,我想要构建一个图表,图的权重是某一条腿飞行的次数。涉及到一条腿的城市对被存储为一组集合。我在创建一个计数/频率字典时遇到了困难,因为“集合是不可理解的”。
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})]但一定有更好的方法。这看起来真的很笨重。
发布于 2021-03-26 01:25:06
如果将集合转换为元组,则可以直接对输入数据使用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})
]发布于 2021-03-26 01:31:32
使用frozenset获得一个可选集。
frozenset替换set可能会奏效。如果不能直接生成
my_concat_list)中的my_out =计数器(用于腿的frozenset(腿))
https://stackoverflow.com/questions/66809690
复制相似问题