列表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
是的,这不起作用(没有错误,我可能只是以绝对错误的方式做到这一点)而且我无法弄清楚我做错了什么和哪里。
答案 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')]