【问题标题】:Index of item in a list of lists of lists (Python)列表列表中的项目索引(Python)
【发布时间】:2013-01-02 14:59:58
【问题描述】:

我正在尝试在以下列表列表中查找字母的索引:

例如:

>>> alphabet = [[["A","B","C"],["D","E","F"],["G","H","I"]],[["J","K","L"],["M","N","O"],["P","Q","R"]],[["S","T","U"],["V","W","X"],["Y","Z","_"]]]
>>> find("H",alphabet)
(0,2,1)

最 Pythonic 的方式是什么?

【问题讨论】:

  • 我应该使用什么替代方案?
  • @HarryE-W -- 这真的取决于你实际使用列表的目的......在你的例子中,一个平面列表似乎是要走的路:alphabet = ["A","B","C","D",...]
  • @mgilson - 我只是将它用作存储字母表的一种方式,但我需要以上面示例中概述的格式检索字母的索引。我有效地将字母表放入 3x3x3 立方体并检索 x、y 和 z 索引。
  • @HarryE-W:从序数计算地址不是更容易吗? H 是第 8 个字母,从那里计算它在立方体中的位置?
  • @HarryE-W -- 在这种情况下,您可能可以通过分析来做到这一点 -- 这与 Martijn 以几秒钟的优势击败我提出的建议基本相同......

标签: python list python-2.7


【解决方案1】:

如果你真的想要一个解决方案来解决这个问题,那么这就是你正在寻找的东西(作为一个简单的递归函数):

def find_recursive(needle, haystack):
    for index, item in enumerate(haystack):
        if not isinstance(item, str):
            try:
                path = find_recursive(needle, item)
                if path is not None:
                    return (index, ) + path
            except TypeError:
                pass
        if needle == item:
            return index,
    return None

编辑:刚刚记住,在 2.x 中,您希望 basestring 也允许使用 unicode 字符串 - 此解决方案适用于 3.x 用户。

【讨论】:

    【解决方案2】:

    您可以简单地更改数据结构并使用dict

    >>> import itertools
    >>> import string
    >>> lets = string.ascii_uppercase
    >>> where = dict(zip(lets, itertools.product(range(3), repeat=3)))
    >>> where
    {'A': (0, 0, 0), 'C': (0, 0, 2), 'B': (0, 0, 1), 'E': (0, 1, 1), 'D': (0, 1, 0), 'G': (0, 2, 0), 'F': (0, 1, 2), 'I': (0, 2, 2), 'H': (0, 2, 1), 'K': (1, 0, 1), 'J': (1, 0, 0), 'M': (1, 1, 0), 'L': (1, 0, 2), 'O': (1, 1, 2), 'N': (1, 1, 1), 'Q': (1, 2, 1), 'P': (1, 2, 0), 'S': (2, 0, 0), 'R': (1, 2, 2), 'U': (2, 0, 2), 'T': (2, 0, 1), 'W': (2, 1, 1), 'V': (2, 1, 0), 'Y': (2, 2, 0), 'X': (2, 1, 2), 'Z': (2, 2, 1)}
    >>> where["H"]
    (0, 2, 1)
    

    但请注意,我不会将U 的位置加倍以填充,所以

    >>> where["U"]
    (2, 0, 2)
    

    【讨论】:

    • 不错的紧凑型解决方案!
    【解决方案3】:
    In [9]: def find(val,lis):
            ind=[(j,i,k) for j,x in enumerate(lis) for i,y in enumerate(x) \
                                                 for k,z in enumerate(y) if z==val]
            return ind[0] if ind else None
       ...: 
    
    In [10]: find("H",alphabet)
    Out[10]: (0, 2, 1)
    
    In [14]: find("M",alphabet)
    Out[14]: (1, 1, 0)
    

    【讨论】:

    • 如果你能写它来处理无限数量的嵌套会更好。
    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2015-05-15
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    相关资源
    最近更新 更多