在Python中迭代和比较列表列表

2024-06-01 19:42:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个Python列表:

checkNameArr = [['551002', 'Derek Jones'], 
                ['940874', 'Hugh Lunny'], 
                ['104741', 'Richard Plaith'], 
                ['310125', 'Aideen Toner'], 
                ['305795', 'Vikki Trench'], 
                ['218714', 'Paul Cutland'], 
                ['401741', 'Russell Smith'], 
                ['223996', 'Chloe Green'], 
                ['845216', 'Simon Fallon'], 
                ['402258', 'Chris Worth']]

queryNameArr = [['551002', 'Derek Jones'], 
                ['940874', 'Hugh Lunny'], 
                ['823085', 'Brian Deans'], 
                ['310125', 'Aideen Toner'], 
                ['571454', 'Pam Scales'], 
                ['967825', 'Una Lingus'], 
                ['401741', 'Russell Smith'], 
                ['682301', 'Hannah Jacobs'], 
                ['914774', 'Elaine Glass'], 
                ['402258', 'Chris Worth']]

我想比较每个列表中的数值。我知道我需要遍历一个列表,将其与下一个列表的第一个值进行比较,如果找到匹配项,则将其存储在找到的列表中。如果找不到,则将该值存储在未找到列表中。我试图用尽可能少的代码来做这件事,但这件事的逻辑让我很困惑。你知道吗

什么是好的清洁解决方案?你知道吗


Tags: richard列表derekchrissmithjonesrussellworth
3条回答

我将通过将每个内部元素转换为tuple,然后遍历另一个列表并检查其元素(转换为tuple)是否存在于集合中,如果存在,则将其添加到found list,否则将其添加到notfound list,从而将要检查的列表转换为set。你知道吗

示例-

checkNameSet = set(map(tuple, checkNameArr))
found = []
notfound = []
for i in queryNameArr:
    if tuple(i) in checkNameSet:
        found.append(i)
    else:
        notfound.append(i)

演示-

>>> checkNameArr = [['551002', 'Derek Jones'],
...                 ['940874', 'Hugh Lunny'],
...                 ['104741', 'Richard Plaith'],
...                 ['310125', 'Aideen Toner'],
...                 ['305795', 'Vikki Trench'],
...                 ['218714', 'Paul Cutland'],
...                 ['401741', 'Russell Smith'],
...                 ['223996', 'Chloe Green'],
...                 ['845216', 'Simon Fallon'],
...                 ['402258', 'Chris Worth']]
>>>
>>> queryNameArr = [['551002', 'Derek Jones'],
...                 ['940874', 'Hugh Lunny'],
...                 ['823085', 'Brian Deans'],
...                 ['310125', 'Aideen Toner'],
...                 ['571454', 'Pam Scales'],
...                 ['967825', 'Una Lingus'],
...                 ['401741', 'Russell Smith'],
...                 ['682301', 'Hannah Jacobs'],
...                 ['914774', 'Elaine Glass'],
...                 ['402258', 'Chris Worth']]
>>>
... checkNameSet = set(map(tuple, checkNameArr))
>>> found = []
>>> notfound = []
>>> for i in queryNameArr:
...     if tuple(i) in checkNameSet:
...             found.append(i)
...     else:
...             notfound.append(i)
...
>>> found
[['551002', 'Derek Jones'], ['940874', 'Hugh Lunny'], ['310125', 'Aideen Toner'], ['401741', 'Russell Smith'], ['402258', 'Chris Worth']]
>>> notfound
[['823085', 'Brian Deans'], ['571454', 'Pam Scales'], ['967825', 'Una Lingus'], ['682301', 'Hannah Jacobs'], ['914774', 'Elaine Glass']]

如果您只想使用一个元素或内部列表的一个子集进行比较,而不是将内部列表的完整元组存储在集合中,那么我们可以使用operator.itemgetter()只获取要单独比较和存储的元素。你知道吗

然后单独用这个比较,代码-

import operator
checkNameSet = set(map(operator.itemgetter(0), checkNameArr))
found = []
notfound = []
for i in queryNameArr:
    if i[0] in checkNameSet:
        found.append(i)
    else:
        notfound.append(i)

示例/演示-

>>> checkNameArr = [['551002', 'Derek Jones'],
...                 ['940874', 'Hugh Lunny'],
...                 ['104741', 'Richard Plaith'],
...                 ['310125', 'Aideen Toner'],
...                 ['305795', 'Vikki Trench'],
...                 ['218714', 'Paul Cutland'],
...                 ['401741', 'Russell Smith'],
...                 ['223996', 'Chloe Green'],
...                 ['845216', 'Simon Fallon'],
...                 ['402258', 'Chris Worth']]
>>>
>>> queryNameArr = [['551002', 'Derek Jones'],
...                 ['940874', 'Hugh Lunny'],
...                 ['823085', 'Brian Deans'],
...                 ['310125', 'Aideen Toner'],
...                 ['571454', 'Pam Scales'],
...                 ['967825', 'Una Lingus'],
...                 ['401741', 'Russell Smith'],
...                 ['682301', 'Hannah Jacobs'],
...                 ['914774', 'Elaine Glass'],
...                 ['402258', 'Chris Worth']]
>>>
... checkNameSet = set(map(operator.itemgetter(0), checkNameArr))
>>> found = []
>>> notfound = []
>>> for i in queryNameArr:
...     if i[0] in checkNameSet:
...             found.append(i)
...     else:
...             notfound.append(i)
...
>>> found
[['551002', 'Derek Jones'], ['940874', 'Hugh Lunny'], ['310125', 'Aideen Toner'], ['401741', 'Russell Smith'], ['402258', 'Chris Worth']]
>>> notfound
[['823085', 'Brian Deans'], ['571454', 'Pam Scales'], ['967825', 'Una Lingus'], ['682301', 'Hannah Jacobs'], ['914774', 'Elaine Glass']]
matchingArr = [item for item in queryNameArr if item in checkNameArr]
notMatchingArr = [item for item in queryNameArr if not item in checkNameArr]

结果:

[['551002', 'Derek Jones'],
 ['940874', 'Hugh Lunny'],
 ['310125', 'Aideen Toner'],
 ['401741', 'Russell Smith'],
 ['402258', 'Chris Worth']]

[['823085', 'Brian Deans'],
 ['571454', 'Pam Scales'],
 ['967825', 'Una Lingus'],
 ['682301', 'Hannah Jacobs'],
 ['914774', 'Elaine Glass']]

基于集合的替代方案:

matchingArr = map(list, set(map(tuple, queryNameArr)).intersection(set(map(tuple, checkNameArr))))
notMatchingArr = map(list, set(map(tuple, queryNameArr)).difference(set(map(tuple, checkNameArr))))

listtuple的转换以及从listtuple的转换有些烦人。。。(但需要,因为集合不能处理列表)。你知道吗

# first, let’s create a set of the check list to quickly check for membership
checkNameSet = set(tuple(x) for x in checkNameArr)

# create lists for matched, and unmatched names
matched = []
unmatched = []

# iterate the query names
for query in queryNameArr:
    # if the query name is in the check set, add it to matched, otherwise unmatched
    if tuple(query) in checkNameSet:
        matched.append(query)
    else:
        unmatched.append(query)
>>> matched
[['551002', 'Derek Jones'], ['940874', 'Hugh Lunny'], ['310125', 'Aideen Toner'], ['401741', 'Russell Smith'], ['402258', 'Chris Worth']]
>>> unmatched
[['823085', 'Brian Deans'], ['571454', 'Pam Scales'], ['967825', 'Una Lingus'], ['682301', 'Hannah Jacobs'], ['914774', 'Elaine Glass']]

相关问题 更多 >