Python 如何计算2D列表或字典列表?

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 =

我从文本文件、IP地址和数据包类型中获取信息。我正在将IP/类型的每一次出现都放入一个列表/目录中?然后我想找到计数,如果IP/类型出现x次,那么我想将该信息移动到另一个列表

这就是我到目前为止所尝试的

口述清单:

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