【问题标题】:How can I index a single value from a list containing sublists in python?python - 如何从包含python子列表的列表中索引单个值?
【发布时间】:2019-03-23 01:16:33
【问题描述】:

例如,现在我有一个列表:

list = [[1276, 'c'], [910, 'b'], [819, 'o'], [759, 'z'], [699, 'l']]

我想只为这个列表索引一个特定的字母,例如:

index = list.index('c')

事实上,我意识到我将得到一个 ValueError,并且我了解到要使这项工作正常进行,我需要为整个子列表建立索引。

index = list.index([1276,'c'])

鉴于我目前不知道整数值,我是否可以解决必须为整个列表编制索引的问题?

我希望这一切都有意义,如果需要,我当然可以提供进一步的说明。

谢谢

【问题讨论】:

  • 您可以遍历列表并为每个项目构建一个 indices 字典,然后使用该字典。 enumerate() 可能会有所帮助。

标签: python list indexing


【解决方案1】:

如果您知道内部列表将只有两个值,您可以创建自己的函数来获取与 next()enumerate() 匹配的第一项:

def get_index(lst, item):
    return next((i for i, (_, x) in enumerate(lst) if x == item), None)

像这样工作:

print(get_index(lst, 'c')) # 0
print(get_index(lst, 'b')) # 1
print(get_index(lst, 'o')) # 2
print(get_index(lst, 'z')) # 3
print(get_index(lst, 'l')) # 4
print(get_index(lst, 'g')) # None

如果未找到项目,则返回 None

根据 cmets 的建议,更好的解决方案是创建索引映射字典:

def get_index(lst, item):
    indices = {x: i for i, (_, x) in enumerate(lst)}
    return indices.get(item)

【讨论】:

    【解决方案2】:

    声明一个实例“等于”任何值的类会有所帮助。

    class Any:
        def __eq__(self, other):
            return True
    
    list = [[1276, 'c'], [910, 'b'], [819, 'o'], [759, 'z'], [699, 'l']]
    index = list.index([Any(), 'c'])
    print(index)
    

    【讨论】:

      【解决方案3】:

      您可以使用仅返回元组的字母部分的列表推导来做到这一点。索引将是相同的。

      index = [c for _,c in list].index('c')
      

      【讨论】:

        【解决方案4】:

        您可以在列表 AKA in range(len(list)) 的长度上迭代一个整数值,而不是直接迭代列表 AKA for i in list 中的项目。

        这里是一个如何获取正确子列表索引的示例。

        list = [[1276, 'c'], [910, 'b'], [819, 'o'], [759, 'z'], [699, 'l']]
        for i in range(len(list)):
            if 'c' in list[i]:
                index = i
                break
        

        【讨论】:

        • 您不需要两个数字来标识列表列表中项目的位置吗?
        • 我的例子只展示了如何获取正确子列表的索引是的。为了在子列表中获得正确的索引,问题本身已经提供了解决方案:index2 = list[i].index('c')
        • @wwii:子列表中字符的索引始终为[-1][1]。所以这里的主要任务就是找到子列表的索引,它包含始终在位置 -1 或 1 的字符
        【解决方案5】:

        使用字典查找通常更快,因此您可以构建字典,例如:

        list_dct  = dict([ [y, [i,x,y]] for i, (x, y) in enumerate(mylist)])
        #=> {'c': [0, 1276, 'c'], 'b': [1, 910, 'b'], 'o': [2, 819, 'o'], 'z': [3, 759, 'z'], 'l': [4, 699, 'l']}
        

        通过这种方式你可以访问索引为:

        list_dct['o'][0] #=> 2
        


        如果您可以摆脱索引,您可以简单地将列表转换为字典,然后按字母访问以获取整数:
        list_dct = dict([ [y,x] for i, (x, y) in enumerate(mylist)])
        
        list_dct #=> {'c': 1276, 'b': 910, 'o': 819, 'z': 759, 'l': 699}
        
        list_dct['c'] #=> 1276
        


        请记住,字典中不允许重复键。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-15
          • 1970-01-01
          • 1970-01-01
          • 2021-12-17
          • 1970-01-01
          • 2023-03-26
          • 2018-04-12
          相关资源
          最近更新 更多