比较python中两个列表之间的元素
清单A: 清单B:比较python中两个列表之间的元素,python,list,Python,List,清单A: 清单B: [('Harry', 'X', 'A'), ('James', 'Y', 'G'), ('John', 'Z', 'D')] 基本上,我必须比较列表A中的第三个元素(表示列表A中的x->x[2]),并检查列表B中是否有任何列表具有相同的元素(,表示列表B中的y,x[2]==y[2]),但我对此简直不知所措 我的想法是从列表B中的每个列表中获取第三个元素,将它们放入一个新的列表中,然后删除“;”这样我就可以更容易地访问每个元素 [('Helen', '2', '(A; B
[('Harry', 'X', 'A'),
('James', 'Y', 'G'),
('John', 'Z', 'D')]
基本上,我必须比较列表A中的第三个元素(表示列表A中的x->x[2]
),并检查列表B中是否有任何列表具有相同的元素(,表示列表B中的y,x[2]==y[2]
),但我对此简直不知所措
我的想法是从列表B中的每个列表中获取第三个元素,将它们放入一个新的列表中,然后删除“;”这样我就可以更容易地访问每个元素
[('Helen', '2', '(A; B)', '3'),
('Victor', '9', '(C; D; E)', '4'),
('Alan', '10', '(A)', '57'),
('Paul', '11', '(F; B)', '43'),
('Sandra', '12', '(F)', '31')]
然后我将从列表A的每个列表中获取第三个元素,并将它们与FinalB的每个列表中的元素进行比较:如果存在匹配,我将获取FinalB中元素的索引(匹配的元素),使用该索引访问列表B中的列表,并获取列表B中列表的第一个元素(基本上,我必须知道每个列表中具有相同第3个元素的用户的姓名)
到目前为止,我的代码是:
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]
是的,这不起作用(没有错误,我可能只是以一种绝对错误的方式做了这件事),我无法找出我做错了什么和哪里。首先,我认为处理
'(C;D;E)
的更好方法是将其更改为'CDE'
,因此第一个循环变成:
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
我们获取每个字符串并只保留字母字符,因此我们最终得到:
FinalB = [filter(str.isalpha, x[2]) for x in listB]
for y in listA:
for z in FinalB:
if y[2] in z:
DomainsList.append([y[0], listB[FinalB.index(z)][0]])
这意味着我们可以使用FinalB[y]中的listA[x][2]来测试我们是否有匹配项:
In [18]: FinalB
Out[18]: ['AB', 'CDE', 'A', 'FB', 'F']
我必须调整append()
的参数以选择正确的元素,因此我们最终得到:
FinalB = [filter(str.isalpha, x[2]) for x in listB]
for y in listA:
for z in FinalB:
if y[2] in z:
DomainsList.append([y[0], listB[FinalB.index(z)][0]])
有用的是,如果您使用的不是'(C;D;E)
,而是'(foo;bar;baz)
,那么使用代码也可以实现这一点:
In [17]: DomainsList
Out[17]: [['Harry', 'Helen'], ['Harry', 'Alan'], ['John', 'Victor']]
剩下的代码与以前一样工作。用上下文和细节开始提问总是有帮助的。
python版本也可以发挥作用
您提供给我们使用的数据结构非常值得怀疑-尤其是listB中每个元组中的第三个元素…为什么要有一个string元素,然后像这样定义它?(C;D;E)
尽管我不明白你们从哪里来,或者这意味着要实现什么,但在文章中并没有提供上下文,这段代码应该能让你们达到目的
它将为您提供一个元组列表(listC),每个元组有两个元素。元素1的名称来自listA,元素2的名称来自listB,在listB中它们有一个匹配项,如本文所述。
注意:目前,匹配仅通过查找完成,这将与提供的详细信息完美配合,但是,如果您可能有可能导致误报的数据,或者如果您希望忽略案例,则可能需要更改此项以适合您的需要
import re
FinalB = [filter(None, re.split("[; \(\)]+", x[2])) for x in listB]
这给了你很多。
[('Harry','Helen'),('Harry','Alan'),('John','Victor')]每个列表周围的括号不平衡。请更新列表,使其具有有效的语法。它如何“不起作用”?FinalB
看起来像什么?j.strip().split(','))
看起来很奇怪,因为在列表中没有逗号a
-事实上,对于列表**B**:
中的x,这不应该是吗?第一个片段对列表B:
中的x使用,但对列表a:
中的x使用第二个。预期的结果是一个列表,其中每个列表都包含有匹配项的每个列表的名称。想象一下列表A和列表B中只有第一个列表匹配。那么结果应该是:FinalList=[('Harry','Helen')]