0

我有几行来填充set.

x = {1: {2: 4, 3: 6}, 5: {2:6, 10: 25, 14: 12}}

keys = set()
for y in x:
    for z in x[y]:
        keys.add(z)

# keys is now `set([2, 3, 10, 14])`

我无法摆脱我可以做得更好的感觉,但我想出的一切似乎都不是很好。大多数实现都建立了list第一个,这很烦人。里面有很多xy而且大部分y都一样z

# Builds a huuuuge list for large dicts.
# Adapted from https://stackoverflow.com/a/953097/241211
keys = set(itertools.chain(*x.values()))

# Still builds that big list, and hard to read as well.
# I wrote this one on my own, but it's pretty terrible.
keys = set(sum([x[y].keys() for y in x], []))

# Is this what I want?
# Finally got the terms in order from https://stackoverflow.com/a/952952/241211
keys = {z for y in x for z in x[y]}

原始代码是“最pythonic”还是单行代码之一更好?还有什么?

4

3 回答 3

6

我会用

{k for d in x.itervalues() for k in d}

itervalues()(仅values()在 Python 3 中)不构建列表,并且此解决方案不涉及字典查找(与 相比{z for y in x for z in x[y]})。

于 2018-01-12T21:57:27.263 回答
4

我会使用itertools模块,特别是chain类。

>>> x = {1: {2: 4, 3: 6}, 5: {2:6, 10: 25, 14: 12}}
>>> from itertools import chain
>>> set(chain.from_iterable(x.itervalues()))
set([2, 3, 10, 14])
于 2018-01-12T21:57:11.247 回答
0

您可以使用dict.items()

x = {1: {2: 4, 3: 6}, 5: {2:6, 10: 25, 14: 12}}
final_x = set(i for b in [b.keys() for i, b in x.items()] for i in b)

输出:

set([2, 3, 10, 14])
于 2018-01-12T21:56:08.917 回答