我编写了一个片段来查找元组列表中的字符串。出于好奇,我想知道它是否可以改进。任何反馈或想法将不胜感激。
我有以下列表
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
答案 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