繁体   English   中英

在嵌套列表中查找匹配项

[英]Find matching items in nested list

我正在尝试将项目列表与另一个不同维度的项目列表进行匹配,并在项目匹配时从第二个列表中打印元素。 例如:

stlist=['6', '3', '4', '2', '5', '1']
ndlist=[['Tom', '1'], ['Joh', '2'], ['Sam', '3'], ['Tommy','4'], ['Nanni', '5'], ['Ron', '6']]

我的输出列表按照我的stlist的升序生成名称。 即Tom,Joh,Sam,Tommy,Nanni,Ron但我希望outputlist与stlist的顺序相同。

我的Python代码是:

for sublist in ndlist:
    for element in stlist:
        if element in sublist[1]:
            print(sublist[0])

从上面的代码显示的输出列表是:Tom,Joh,Sam,Tommy,Nanni,Ron而不是

outputlist = [Ron, Sam, Tommy, Joh, Nanni, Tom]

所以它实际上按升序排序我的1stlist并按顺序打印第二个列表中的名称。但是如果我的stlist按升序排列,则输出列表就可以了。

任何人都可以告诉我为什么请,我应该如何修改代码以获得我想要的输出列表。

尝试重新排列for循环:

for element in stlist:
    for sublist in ndlist:
        if element in sublist[1]:
            print (sublist[0])

此外,if语句应该是这样的: if element == sublist[1]:或者元素'1'可以在某个ndlist元素中找到,如下所示: ['foo', '10']

此外,对于大型列表,此解决方案不是最有效的。 为了提高效率,您可以尝试对ndlist进行排序和执行二进制搜索以检查元素是否存在。

您可以使用sorted和自定义排序键(Lambda函数)来执行此操作:

>>> [i[0] for i in sorted(ndlist, key = lambda x:stlist.index(x[1]))]
['Ron', 'Sam', 'Tommy', 'Joh', 'Nanni', 'Tom']

这行代码使用ndlist中数字的位置作为排序键对stlist进行排序,然后列表stlist构建一个仅包含名称的新列表。

除了嵌套循环或排序之外,您还可以使用一个线性运行ndlist创建映射,然后使用另一个线性运行stlist来构建结果列表:

mapping = dict((b, a) for a, b in ndlist)
result = [mapping[x] for x in stlist]
print(result)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM