在元组列表中搜索字符串的更好方法

时间:2018-03-06 17:05:09

标签: python

我编写了一个片段来查找元组列表中的字符串。出于好奇,我想知道它是否可以改进。任何反馈或想法将不胜感激。

我有以下列表

  final_artist_filenames = [] 

  files = ['102257.jpg','752232.jpg','32145.jpg','20304.jpg']

  artist_tuples = [('House Manhufe','102257.jpg'), 
                   ('Bernett Newman','75232.jpg'),
                   ('House Manhufe','32145.jpg'),
                   ('Kiri nichol','20304.jpg'),
                   ('Wolfgang', '48876.jpg'),
                   ('Arabesque','63861.jpg'),
                   ('Francis','99442.jpg')]

列出文件名在列表files中的所有元组。

所以预期的输出是

[('House Manhufe','102257.jpg'),('Bernett Newman','75232.jpg'),('House Manhufe','32145.jpg'),('Kiri nichol','20304.jpg')]

以下是我的实施

    final_artist_filenames = [] 

    files = ['102257.jpg','752232.jpg','32145.jpg','20304.jpg']

    artist_tuples = [('House Manhufe','102257.jpg'), 
                   ('Bernett Newman','75232.jpg'),
                   ('House Manhufe','32145.jpg'),
                   ('Kiri nichol','20304.jpg'),
                   ('Wolfgang', '48876.jpg'),
                   ('Arabesque','63861.jpg'),
                   ('Francis','99442.jpg')]


    for filename in files:
        for etuple in artist_tuples:
            if etuple[1] == filename:
               final_artist_filenames.append((artist,etuple[1]))

请求更好版本的原因是每个列表的长度

  len(files) = 8000
  len(artist_tuples) = 10000

2 个答案:

答案 0 :(得分:0)

我不确定它会更好,你必须尝试和解决这两种解决方案,但也许列表理解可能会更快。

[(name, file) for name, file in artist_tuples if file in files]

可以测试并且可能更快的第二个解决方案是使用numpy数组而不是list。也许即使你必须先转换成一个numpy数组(np.asarray),我认为整个过程应该更快。

答案 1 :(得分:0)

我认为你可以做的最大改进之一就是使用字典。您可以在字典中为artist_tuples中的每个文件名执行单个查找,而不是遍历files中每个文件名的所有files。这应该会加速你的代码。

我不确定你是否必须将输出重新输入元组,所以第一个例子会这样做,但另一个例子将结果输出到字典中(基本上是by_filename的子字典,由{{过滤1}})。

files