Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较python中两个列表之间的元素_Python_List - Fatal编程技术网

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

比较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

清单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')]