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)
我有一个大的航段数据集,我想构建一个图表,其中图表的权重是特定航段的飞行次数。腿中涉及的城市对存储为集合列表。我在创建 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)