列出按第一项分组的元组(用作Python字典键)中的第二项

时间:2017-08-28 22:45:02

标签: python python-3.x

我有一个元组词典:( port,freq)。

d = {(0, 410): None, (1, 640): None, (2, 88): None, (2, 410): None, (0, 33): None}

我想收集所有具有相同端口号的元组,这些元组的频率是唯一的。然后我想列出这些频率。

如果我可以做到这一点而没有一个非常好的值,因为它不是必需的,但是端口,freq必须是唯一的并且使它们成为键允许我实现这一点。

我设法列出了所有频率,但这不是我想要的。

_, freq = zip (*list( d.keys() ))

有人能告诉我一种有效的pythonic方法吗?

4 个答案:

答案 0 :(得分:2)

zip并不是一种无效的方式来做你需要的事情 简单的列表理解就足够了:

freq = [x[1] for x in d]

或者:

import operator as op
freq = list(map(op.itemgetter(1), d))

答案 1 :(得分:1)

None有价值的词典看起来很尴尬,一套也有效

d = {(0, 410), (1, 640), (2, 88), (2, 410), (0, 33)}
type(d)
Out[410]: set
如果允许标准库,

itertools groupby是工具

from itertools import groupby


grouped = [(k, *g) for k, g in groupby(sorted(list(d),
                                              key=lambda x: x[0]),
                                       key=lambda x: x[0])]
print(*grouped, sep='\n')
(0, (0, 410), (0, 33))
(1, (1, 640))
(2, (2, 88), (2, 410))

我提出的拆分groupby结构似乎很丑陋

[(b[0], list(b[-1])) 
 for b in [(a[0], *zip(*a[1:])) 
           for a in grouped ]]
Out[399]: [(0, [410, 33]), (1, [640]), (2, [88, 410])] 

答案 2 :(得分:1)

这正是为collections.defaultdict创建的问题。

如果您在访问丢失的密钥时创建新的defaultdict,则可以创建list

from collections import defaultdict as ddict

dd = ddict(list)

现在,您可以使用所有元组中的第二项填充默认字典:

for port, freq in d:
    dd[port].append(freq)

完成。这是有效的,因为每次访问值为port的缺失键时,都会创建一个新的list,然后您只需附加到该列表。如果密钥已经存在,则只需附加到现有列表。

现在您可以访问任何给定端口的所有频率:

print(dd[0])

注意:如果您的第一个数据结构的目标是拥有一组唯一元组,而不是使用字典来保存元组,我建议使用set代替。 set只是一组唯一的项目,没有要考虑的关联值:

>>> s = {(0, 410), (1, 640), (2, 88), (2, 410), (0, 33)}
>>> type(s).__name__
'set'

答案 3 :(得分:0)

一个简单的解决方案。

让我们创建一个字典,其中每个键都是端口,每个值都是一个频率列表,这允许您根据需要对它们求和或对它们进行操作,并为您提供O(1)访问权限!

#first let's make a dict of all the keys with empty lists
my_dict = dict.fromkeys( [str(x[0]) for x in d.keys()], [])

#now let's append those frequencies!
[my_dict[str(soc)].append(freq) for soc, freq in d.keys()]

请注意,这并没有为您提供排序结构,但您可以保存套接字列表并将其用于from_keys方法,并具有访问套接字的排序方式。 e.g。

sockets = [str(x[0]) for x in d.keys()] #str() allows us to use an integer as a key, keep this in mind!

然而,这使得访问给定套接字的所有不同频率变得非常容易,如下所示:

my_dict['socket']

翻译复制粘贴演示:

>>> d = {(0, 410): None, (1, 640): None, (2, 88): None, (2, 410): None, (0, 33): None}
>>> my_dict = dict.fromkeys( [str(x[0]) for x in d.keys()], [])
>>> [my_dict[str(soc)].append(freq) for soc, freq in d.keys()]
[None, None, None, None, None]
>>> my_dict
{'0': [410, 640, 88, 410, 33], '1': [410, 640, 88, 410, 33], '2': [410, 640, 88, 410, 33]}
>>>

请注意,这会转换为您拥有的当前格式(或编辑您的帖子并ping我:D)。你可以调整你可能拥有的任何代码来获得类似的结果,并且具有相同的幸福感来访问事物。保持按键的排序列表使生活变得非常简单。 Python3应该默认排序字典,所以不要接受我的话,但是如果你使用my_dict.keys()它应该以有条件的方式返回它们,但我对它的操作方式可能是错误的。

外卖

套接字的字典 - >频率将是最容易处理的。可选的已排序的套接字列表也可能有帮助