【问题标题】:Getting the indexes of each element in a list of lists and making a dictionary获取列表列表中每个元素的索引并制作字典
【发布时间】:2020-06-22 13:09:40
【问题描述】:

我正在尝试创建一个字典,其中键是每个列表的元素,值是它们在该列表列表中的索引,以便我可以轻松找到每个元素的确切位置。

所以如果列表是[['a', 'a', 'b'], ['a', 'b', 'b'], ['c', 'c', 'c']]

字典应该是这样的:{'c': {(2, 0), (2, 1), (2, 2)}, 'b': {(1, 1), (1, 2), (0, 2)}, 'a': {(0, 1), (1, 0), (0, 0)}}

我可以通过列表理解在各自的列表中获取每个元素的索引:final_list = [list(enumerate(i)) for i in mylist],但我无法找到一种方法来获取它们的“完整”索引,其中也包括其列表的索引。

【问题讨论】:

  • 您是否尝试过任何没有列表理解的解决方案?

标签: python python-3.x list dictionary


【解决方案1】:

虽然编写单行代码效率非常低,但您可以使用collections.defaultdict 来简化事情。使用dict.setdefault 实际上更好,因为它不会在您每次想要附加值时创建一个空容器,即使键已经存在:

result = defaultdict(list)
for i, row in enumerate(mylist):
     for j, key in enumerate(row):
         result[key].append((i, j))

单行解决方案必须多次通过mylist 才能累积给定键的所有值。这将是不必要的复杂并以 O(n^2) 时间复杂度运行。

【讨论】:

  • 非常感谢您的详细解释
  • @arthionne。很高兴你喜欢它。
  • 很好的解决方案,有人要求单线,因为我没有看到问题中提到它
  • @jamylak。我以为 OP 想要一个单一的理解,但我把它和另一个问题混淆了。
  • 为什么 dict.setdefault 每次要附加一个值时都会创建一个容器?您可以查看文档docs.python.org/3/library/stdtypes.html#dict.setdefault
【解决方案2】:

你可以使用:

l = [['a', 'a', 'b'], ['a', 'b', 'b'], ['c', 'c', 'c']]

result = {}
for i, e in enumerate(l):
    for j, x in enumerate(e):
        result.setdefault(x, set()).add((i, j))
print(result)

输出:

{'a': {(0, 0), (0, 1), (1, 0)},
 'b': {(0, 2), (1, 1), (1, 2)},
 'c': {(2, 0), (2, 1), (2, 2)}}

【讨论】:

    【解决方案3】:

    你可以这样做:

    res = {}
    for i, l in enumerate(var):
        for j, letter in enumerate(l):
            res[letter] = res.get(letter, set()) | {(i, j)}
    
    res
    
    # {'a': {(0, 0), (0, 1), (1, 0)},
    #  'b': {(0, 2), (1, 1), (1, 2)},
    #  'c': {(2, 0), (2, 1), (2, 2)}}
    

    【讨论】:

      【解决方案4】:

      这是一个简单的解决方案:

      input = [['a', 'a', 'b'], ['a', 'b', 'b'], ['c', 'c', 'c']]
      
      result = {}
      for i, lst in enumerate(input):
          for j, element in enumerate(lst):
              if element in result:
                  result[element].add((i, j))
              else:
                  result[element] = {(i, j)}
      

      【讨论】:

      • 感谢您的编辑。仅供参考,{} 创建dict,对于set,我们可以使用set()。 +1
      • 不客气@zipa,我比我更喜欢你的回答,你的想法值得 +1 :)
      猜你喜欢
      • 2013-12-03
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多