给定如下格式的字典:
nodes = {1: {'pos': (1, 2), 'other_data': 'N/A'},
2: {'pos': (2, 2), 'other_data': 'N/A'},
3: {'pos': (4, 3), 'other_data': 'N/A'},
4: {'pos': (5, 3), 'other_data': 'N/A'},
5: {'pos': (6, 3), 'other_data': 'N/A'},
6: {'pos': (1, 4), 'other_data': 'N/A'},
7: {'pos': (2, 4), 'other_data': 'N/A'},
8: {'pos': (4, 5), 'other_data': 'N/A'},
9: {'pos': (5, 5), 'other_data': 'N/A'},
10: {'pos': (6, 5), 'other_data': 'N/A'}}
我想创建一个仅包含出现少于3次的位置的Y值的列表或集合。维持秩序并不重要。'other_data'已被包括在内,但为了可读性起见缩短了。
到目前为止,我有这个:
foo = [values.get('pos')[1] for values in nodes.values()]
bar = set(x for x in foo if foo.count(x) < 3)
print(bar)
这确实给了我预期的结果:
{2, 4}
但是我希望找到一种更python化的方法或者只使用一行的方法,因为我现在这样做看起来很笨拙。
您可以从Collections
中使用Counter
,并将y值列表传递给Counter,然后您可以使用列表推导并仅取计数小于3的键,或者您可以使用filter
并过滤掉您不需要的值:
>>> from collections import Counter
>>> [k for k,v in Counter(d['pos'][1] for d in nodes.values()).items() if v<3]
[2, 4]