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

时间:2017-12-11 00:38:49

标签: python list

列表A:

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

列表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中的第三个元素(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中列表的第一个元素(基本上,我必须知道每个列表中具有相同第3个元素的用户的名称)

到目前为止我的代码:

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

是的,这不起作用(没有错误,我可能只是以绝对错误的方式做到这一点)而且我无法弄清楚我做错了什么和哪里。

2 个答案:

答案 0 :(得分:0)

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

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

我们接受每个字符串并仅保留字母字符,因此我们最终得到:

In [18]: FinalB
Out[18]: ['AB', 'CDE', 'A', 'FB', 'F']

这意味着我们可以使用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()的参数来选择正确的元素,所以我们最终得到:

In [17]: DomainsList
Out[17]: [['Harry', 'Helen'], ['Harry', 'Alan'], ['John', 'Victor']]

有用的是,如果'(C; D; E)'取代'(foo; bar; baz)',而import re FinalB = [filter(None, re.split("[; \(\)]+", x[2])) for x in listB] 取代https://docs.npmjs.com/files/package-locks,则代码也适用于此:

{{1}}

其余代码与以前一样。

答案 1 :(得分:0)

使用上下文和详细信息启动问题总是有帮助的。 python版本也可以发挥作用。

你给我们使用的数据结构是非常值得怀疑的 - 特别是listB中每个元组中的第三个元素...为什么有一个字符串元素然后像这样定义'(C; D; E )'??

即使我不明白你来自哪里或者这意味着什么,但是在帖子中没有提供上下文,这段代码可以帮助你。

它将为您提供一个tupples列表(listC),每个元组都有两个元素。元素一具有listA的名称,元素2的名称来自listB,其中它们具有匹配,如post中所述。 注意:目前只需使用查找完成匹配,这将与提供的详细信息完美匹配,但是如果您的数据可能导致误报或者您需要,则可能需要将其更改为适合您的需要忽略大小。

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