比较python中两个列表之间的元素

2024-10-04 09:26:25 发布

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

列表A:

[('Harry', 'X', 'A'),
 ('James', 'Y', 'G'),
 ('John', 'Z', 'D')]

列表B:

^{pr2}$

基本上,我必须比较列表A中的第三个元素(for x in listA -> x[2]),并检查列表B中是否有相同的元素(for y in listB, x[2] == y[2])的列表,但我对此感到茫然。在

我的想法是从列表B中的每个列表中获取第三个元素,将它们放入一个新列表中,然后删除“;”,这样我就可以更轻松地访问每个元素。在

for x in listB:
    j = x[2]
    j = j.strip().split(', ')
    for k in j:
        FinalB.append(k)

FinalB = [(k[1:-1].split(";")) for k in FinalB]

然后我从列表A的每个列表中获取第三个元素,并将它们与FinalB的每个列表中的元素进行比较:如果有匹配,我将获得FinalB中元素的索引(匹配的元素),使用该索引访问listB中的列表,并获得列表B中列表的第一个元素(基本上,从第三个元素中我知道每个用户都有相同的名称)

目前我的代码:

FinalB= []
DomainsList = []
for x in listA:
    j = x[2]
    j = j.strip().split(', ')
    for k in j:
        FinalB.append(k)

FinalB = [(k[1:-1].split(";")) for k in FinalB]

for y in listA:
    for z in FinalB:
        for k in z:
            if y[2] == k:
                m = FinalB.index(z)
                DomainsList.append([listA[m][0],listB[m][0]])
return DomainsList

是的,这是不起作用的(没有错误,我可能只是做了一个绝对错误的方式),我不知道我做错了什么和哪里。在


Tags: in元素列表for错误johnsplitstrip
2条回答

首先,我认为处理'(C; D; E)'的更好方法是将其更改为'CDE',因此第一个循环变成:

FinalB = [filter(str.isalpha, x[2]) for x in listB]

我们获取每个字符串并只保留字母字符,因此最终得到:

^{pr2}$

这意味着我们可以使用listA[x][2] in FinalB[y]来测试是否有匹配项:

for y in listA:
    for z in FinalB:
        if y[2] in z:
            DomainsList.append([y[0], listB[FinalB.index(z)][0]])

我不得不调整append()的参数以选择正确的元素,因此我们最终得到:

^{4}$

有用的是,如果不是'(C; D; E)',而是'(foo; bar; baz)',那么使用just one tweak代码也可以起作用:

import re
FinalB = [filter(None, re.split("[; \(\)]+", x[2])) for x in listB]

剩下的代码和以前一样工作。在

从背景和细节开始提问总是有帮助的。 python版本也可以发挥作用。在

您为我们提供的数据结构是非常可疑的-尤其是listB中每个元组中的第三个元素…为什么要有一个string元素然后像这样定义它(C;D;E)'??在

即使我不明白你从何而来,或者这意味着什么,在post中没有提供上下文,这段代码应该能让你达到目的。在

它将给您一个元组列表(listC),每个元组有两个元素。元素1具有来自listA的名称,元素2具有来自listB的名称,它们具有post中描述的匹配项。 注意:目前,匹配只是通过一个find来完成,这将与所提供的细节完美结合,但是如果您可能有可能导致误报的数据,或者如果您想忽略case,则可能需要更改此项以适合您的需要。在

listA = [('Harry', 'X', 'A'), ('James', 'Y', 'G'), ('John', 'Z', 'D')]

listB = [('Helen', '2', '(A; B)', '3'), 
         ('Victor', '9', '(C; D; E)', '4'), 
         ('Alan', '10', '(A)', '57'), 
         ('Paul', '11', '(F; B)', '43'), 
         ('Sandra', '12', '(F)', '31')]

listC = []

for a in listA:
  for b in listB:
     if b[2].find(a[2]) != -1:
       listC.append((a[0], b[0]))

print(listC)

这给了你。 [('Harry','Helen'),('Harry','Alan'),('John','Victor')]

相关问题 更多 >