[英]How to find index from a tuple by using elements from another tuple
我有以下信息元组,如何从名称元组中找到元组 [?] 的索引?
info = [('Water SPF 15', '12B', '#f2c9b5', 31, '-100.1', '-100.1', '-100.1', '12N', '', '', '27B'), ('Water Spectrum SPF 15', '12B', '#f2c9b5', 31, '7..7', '7..7', '7..7', '12N', '', '', '27B'), ('Water Foundation SPF 15', '12N', '#e5be9d', 44, ' ', ' ', ' ', '', '12B', '', '15N'), ('FACE15', '12N', '#e5be9d', 44, '**', '**', '**', '12S', '14H', '', '16N'), ('FACE', '12B', '#f2c9b5', 31, 'asd', 'asd', 'asd', '14H', '', '8B', '18B'), ('hydrator', '10N', '#e5be9d', 44, '', '', '', '', '', '', '13N'), ('APE', '12B', '#e7cbb3', 39, '-100', '-100', '-100', '', '', '', '')]
name = [('Water Spectrum SPF 15', '12B', '#f2c9b5'),('FACE15', '12N', '#e5be9d')]
matched_index = []
n = 0
for i in info :
if name[n][0] and name[n][1] and name[n][2] == i[n][0] and i[n][1] and i[n][2]:
print("match")
matched_index.append(n)
n = n + 1
else:
n = n + 1
print("DONE")
有没有办法只匹配上面的前 3 个元素? 当 n 达到 3 时我会收到错误...
类似于下面的东西
infos = [('Water SPF 15', '12B', '#f2c9b5', 31, '-100.1', '-100.1', '-100.1', '12N', '', '', '27B'),
('Water Spectrum SPF 15', '12B', '#f2c9b5', 31, '7..7', '7..7', '7..7', '12N', '', '', '27B'),
('Water Foundation SPF 15', '12N', '#e5be9d', 44, ' ', ' ', ' ', '', '12B', '', '15N'),
('FACE15', '12N', '#e5be9d', 44, '**', '**', '**', '12S', '14H', '', '16N'),
('FACE', '12B', '#f2c9b5', 31, 'asd', 'asd', 'asd', '14H', '', '8B', '18B'),
('hydrator', '10N', '#e5be9d', 44, '', '', '', '', '', '', '13N'),
('APE', '12B', '#e7cbb3', 39, '-100', '-100', '-100', '', '', '', '')]
names = [('Water Spectrum SPF 15', '12B', '#f2c9b5'), ('FACE15', '12N', '#e5be9d')]
for name in names:
for idx, info in enumerate(infos):
if name[0] == info[0] and name[1] == info[1] and name[2] == info[2]:
print(f'{name} {idx}')
output
('Water Spectrum SPF 15', '12B', '#f2c9b5') 1
('FACE15', '12N', '#e5be9d') 3
您还可以考虑使用列表理解,它优于 Python 中的传统循环:
仅获取索引:
lst = [idx for idx, info in enumerate(infos) for name in names if name == info[:3]]
print(lst)
Output: [1, 3]
作为字典列表:
lst = [{name:idx} for idx, info in enumerate(infos) for name in names if name == info[:3]]
print(lst)
Output:
[{('Water Spectrum SPF 15', '12B', '#f2c9b5'): 1}, {('FACE15', '12N', '#e5be9d'): 3}]
您可以通过首先将info
中的元组转换为由每个元组的前 3 项以索引为值的字典来避免嵌套循环。 然后一个简单的字典查找提供了结果。 总体而言,这将为嵌套循环提供O(n)与O(n 2 )的运行时间复杂度:
info = [('Water SPF 15', '12B', '#f2c9b5', 31, '-100.1', '-100.1', '-100.1', '12N', '', '', '27B'), ('Water Spectrum SPF 15', '12B', '#f2c9b5', 31, '7..7', '7..7', '7..7', '12N', '', '', '27B'), ('Water Foundation SPF 15', '12N', '#e5be9d', 44, ' ', ' ', ' ', '', '12B', '', '15N'), ('FACE15', '12N', '#e5be9d', 44, '**', '**', '**', '12S', '14H', '', '16N'), ('FACE', '12B', '#f2c9b5', 31, 'asd', 'asd', 'asd', '14H', '', '8B', '18B'), ('hydrator', '10N', '#e5be9d', 44, '', '', '', '', '', '', '13N'), ('APE', '12B', '#e7cbb3', 39, '-100', '-100', '-100', '', '', '', '')]
name = [('Water Spectrum SPF 15', '12B', '#f2c9b5'),('FACE15', '12N', '#e5be9d')]
lookup = {t[:3]: i for i,t in enumerate(info)}
for n in name:
if n in lookup:
print(n, lookup[n])
Output:
('Water Spectrum SPF 15', '12B', '#f2c9b5') 1
('FACE15', '12N', '#e5be9d') 3
如果您只想将索引存储在列表中:
lookup = {t[:3]: i for i,t in enumerate(info)}
matched_index = [lookup[n] for n in name if n in lookup]
print(matched_index)
Output
[1, 3]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.