【问题标题】:How to find index from a tuple by using elements from another tuple如何使用另一个元组中的元素从一个元组中查找索引
【发布时间】:2021-03-10 10:23:07
【问题描述】:

我有以下信息元组,如何从名称元组中找到元组[?]的索引?

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 时我会出错...

【问题讨论】:

    标签: python python-3.x indexing tuples


    【解决方案1】:

    类似下面的

    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}')
    

    输出

    ('Water Spectrum SPF 15', '12B', '#f2c9b5') 1
    ('FACE15', '12N', '#e5be9d') 3
    

    【讨论】:

      【解决方案2】:

      您可以通过首先将info 中的元组转换为一个字典,该字典由每个元组的前 3 项以索引为值,从而避免嵌套循环。然后一个简单的字典查找提供了结果。总体而言,嵌套循环的运行时间复杂度为 O(n) vs O(n2)

      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])
      

      输出:

      ('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)
      

      输出

      [1, 3]
      

      【讨论】:

        【解决方案3】:

        您还可以考虑使用列表推导,它比 Python 中的传统循环更受欢迎:

        只获取索引:

        lst = [idx for idx, info in enumerate(infos) for name in names if name == info[:3]]
        print(lst)
        

        输出:[1, 3]

        作为字典列表:

        lst = [{name:idx} for idx, info in enumerate(infos) for name in names if name == info[:3]]
        print(lst)
        

        输出:

        [{('Water Spectrum SPF 15', '12B', '#f2c9b5'): 1}, {('FACE15', '12N', '#e5be9d'): 3}]
        

        【讨论】:

        • 元组字段比较可以更简洁地使用:if name == info[:3],因为名称元组中的 3 项应与信息元组中的前 3 项匹配。
        猜你喜欢
        • 2013-07-19
        • 2016-09-24
        • 1970-01-01
        • 2020-06-10
        • 2012-07-19
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        相关资源
        最近更新 更多