Python 3.4:如果条件存在,则向列表添加值

4

i have a scenario like this one:

mainList = [[9,5],[17,3],[23,1],[9,2]]
secondaryList = [9,12,28,23,1,6,95]
myNewList = []

myNewList.append([[a,b] for a,b in mainList if a in secondaryList])

this, return me to me:

myNewList = [[9,5],[23,1],[9,2]]

但我只需要第一个出现的“a”。换句话说,我需要获得:

myNewList = [[9,5],[23,1]]

如何实现这个目标?
2个回答

5

首先:

myNewList = []
myNewList.append([[a,b] for a,b in mainList if a in secondaryList])

简单地说,这与

myNewList = [[a,b] for a,b in mainList if a in secondaryList]

那么你正在构建的实际上是一个Python字典。你在mainList中的两个元素列表与dict.items()相同!

所以你要做的就是将mainList构建为一个dict(反转它,因为通常情况下,你只保存最后一次出现而不是第一次):

mainDict = dict([reversed(mainList)])

然后您只需要创建您的新列表:
myNewList = [ (key, mainDict[key]) for key in secondaryList ]

对我不起作用: mainDict = dict([reversed(secondaryList)]) ValueError: 字典更新序列元素#0的长度为7; 需要2 - jul

2
你可以使用集合(set)存储第一个元素,然后在添加子列表之前检查第一个元素是否存在。
>>> seen=set()
>>> l=[]
>>> for i,j in mainList:
...    if i in secondaryList and i not in seen:
...        seen.add(i)
...        l.append([i,j])
... 
>>> l
[[9, 5], [23, 1]]

或者你可以使用collections.defaultdictdeque并指定maxlen。但请注意,如果你想要第一个出现的a,你需要从后往前遍历列表,因为deque会保留最后插入的值:

>>> from collections import defaultdict
>>> from functools import partial

>>> d=defaultdict(partial(deque, maxlen=1))
>>> for i,j in mainList[::-1]:
...    if i in secondaryList:
...       d[i].append(j)
... 
>>> d
defaultdict(<functools.partial object at 0x7ff672706e68>, {9: deque([5], maxlen=1), 23: deque([1], maxlen=1)})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接