Python 什么';将对象的两个元素添加到列表中而不重复它们的最佳方法是什么?
性能、优雅和可读性是“最佳方式”的要求 我有一系列字典:Python 什么';将对象的两个元素添加到列表中而不重复它们的最佳方法是什么?,python,list,for-loop,iteration,Python,List,For Loop,Iteration,性能、优雅和可读性是“最佳方式”的要求 我有一系列字典: items = [ {'id1' : 1, 'id2' : 2, 'other' : 'xxx'}, {'id1' : 1, 'id2' : 3, 'other' : 'yyy'}, {'id1' : 2, 'id2' : 4, 'other' : 'zzz'} ] 结果应该是:ids=[1,2,3,4](id1和id2的列表) 编辑: 大概是这样的: ids = [] for item in items:
items = [
{'id1' : 1, 'id2' : 2, 'other' : 'xxx'},
{'id1' : 1, 'id2' : 3, 'other' : 'yyy'},
{'id1' : 2, 'id2' : 4, 'other' : 'zzz'}
]
结果应该是:ids=[1,2,3,4]
(id1和id2的列表)
编辑:
大概是这样的:
ids = []
for item in items:
if item.id1 not in ids:
ids.append(item.id1)
if item.id2 not in ids:
ids.append(item.id2)
更新问题的更新
>>> set(v for y in items for (k,v) in y.items() if k.startswith('id'))
set([1, 2, 3, 4])
这可以很容易地通过使用来展平生成id值的嵌套键来完成-我们假设所有键都是字符串,并且以
“id”
开头的键指定了一个id。然后我们创建一组这些值来删除重复项:
from itertools import chain
set(chain.from_iterable((value for name, value in item.items()
if name.startswith("id"))
for item in items))
如果您真的想要一个列表,那么您可以从集合中创建一个列表,但是在大多数情况下,集合应该是很好的。请注意,集合没有顺序,因此,如果您想要一个顺序,您需要使用sorted()
,例如
itertools.chain.from_iterable()
是展平iterable的最有效和可读的方法
当涉及到什么是id时,您的规范并不明确。如果您有一组定义id的键,那么像这样的东西可能更适合作为内部生成器表达式的If子句:
if name in {"id1", "id2"}
请注意,这些值实际上不是按顺序排列的。除非您明确想要
id1
和id2
。您需要原始顺序吗?我忘了提到字典中还有其他元素,只需要id列表。@ShankarCabus什么定义了id?还有什么其他因素?您在这里没有给我们提供足够的信息。检查这样构建的集合的成员身份需要比元组更长的时间。即使它会稍微长一点。@jamylak是真的,但通常这两种方式都不重要,我倾向于使用集合,因为当集合的可能性很大(唯一可能重要的情况)时,这是一个好习惯。
if name in {"id1", "id2"}