Python 如何计算2D列表或字典列表?
我从文本文件、IP地址和数据包类型中获取信息。我正在将IP/类型的每一次出现都放入一个列表/目录中?然后我想找到计数,如果IP/类型出现x次,那么我想将该信息移动到另一个列表 这就是我到目前为止所尝试的 口述清单:Python 如何计算2D列表或字典列表?,python,list,dictionary,2d,Python,List,Dictionary,2d,我从文本文件、IP地址和数据包类型中获取信息。我正在将IP/类型的每一次出现都放入一个列表/目录中?然后我想找到计数,如果IP/类型出现x次,那么我想将该信息移动到另一个列表 这就是我到目前为止所尝试的 口述清单: data = [{'ip': '192.168', 'type': 'UDP'}, {'ip': '192.173', 'type': 'TCP'}, {'ip': '192.168', 'type': 'UDP'}] 或二维列表 data =
data = [{'ip': '192.168', 'type': 'UDP'},
{'ip': '192.173', 'type': 'TCP'},
{'ip': '192.168', 'type': 'UDP'}]
或二维列表
data = [['192.168', 'UDP'],
['192.173', 'TCP'],
['192.168', 'UDP']]
我想把192.168,UDP移到另一个有计数的列表,因为它显示了x次以上。我尝试了一个计数器
,但我只能让它通过ip,而不能通过ip和键入
ipInfo = Counter(k['ip'] for k in data if k.get('ip'))
for info, count in ipInfo.most_common():
print info, count
这只打印出192.168,2
而不是192.168,UDP,2
在我的示例中,我希望能够将
[192.168,UDP,2]
或{'ip':'192.168','type':'UDP','count':2}
添加到另一个列表中。如果您的数据是第二种形式的二维列表,您可以使用:
In [1]: data = [['192.168', 'UDP'],
...: ['192.173', 'TCP'],
...: ['192.168', 'UDP']]
In [2]: c = Counter(tuple(r) for r in data)
In [3]: for info, count in c.most_common():
...: print info, count
(u'192.168', u'UDP') 2
(u'192.173', u'TCP') 1
下面是一些既适用于列表列表又适用于dicts列表的内容:
from collections import Counter, Sequence
from pprint import pprint
def move_info(data):
""" Copy info from data list into another list with an occurence count added.
data can be a list of dicts or tuples.
"""
if isinstance(data[0], dict):
counter = Counter((dct['ip'], dct['type']) for dct in data1)
result = [dict(ip=info[0], type=info[1], count=count)
for info, count in sorted(counter.items())]
return result
elif isinstance(data[0], Sequence):
counter = Counter(tuple(elem) for elem in data2)
result = [list(info) + [count] for info, count in sorted(counter.items())]
return result
raise TypeError("Can't move info from a {}".format(type(data)))
# list of dicts
data1 = [{'ip': '192.168', 'type': 'UDP'},
{'ip': '192.173', 'type': 'TCP'},
{'ip': '192.168', 'type': 'UDP'}]
# list of lists
data2 = [['192.168', 'UDP'],
['192.173', 'TCP'],
['192.168', 'UDP']]
another_list = move_info(data1)
pprint(another_list)
print('')
another_list = move_info(data2)
pprint(another_list)
输出:
[{'count':2,'ip':'192.168','type':'UDP'},
{'count':1,'ip':'192.173','type':'TCP'}]
[['192.168','UDP',2],'192.173','TCP',1]]
result
('192.168', 'UDP') 2
('192.173', 'TCP') 1
您的意思是像计数器(k['ip']表示data.iteritems()中的k,如果k.get('ip'))或计数器(data.iteritems())。这两种方法都不管用,这很完美。谢谢。我对python还是相当陌生的,所以我不熟悉所有这些数据结构,只是最近才了解字典。
('192.168', 'UDP') 2
('192.173', 'TCP') 1