[英]Iterating and comparing list of lists in Python
我在Python中有2個列表:
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']]
我想比較每個列表中的數字值。 我知道我需要遍歷一個列表以將其與下一個列表的第一個值進行比較,如果找到匹配項,則將其存儲在找到的列表中。 如果找不到,則將該值存儲在“找不到”列表中。 我正在嘗試以盡可能少的代碼來執行此操作,但是這樣做的后勤使我感到困惑。
有什么好的清潔解決方案?
我會在其中要檢查的列表轉換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))))
從list
到tuple
,反之亦然的轉換有點煩人……(但有必要,因為集合不能在列表上使用)。
# 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']]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.