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"}