反转类似字符串搜索列表的最佳方法

时间:2010-08-20 14:10:58

标签: python arrays multidimensional-array indexing reverse

我有一个数据列表,包括命令字符串以及字母,大写和小写,总计512+(包括子列表)字符串。我想解析输入数据,但我想不出任何方法来正确地做到这一点,除了从最大可能的命令大小开始并切断它,直到我找到一个与字符串相同的命令,然后输出的位置命令,但这需要永远。我能想到的任何其他方式都会导致重叠。我在python中这样做

说:

L = ['a', 'b',['aa','bb','cc'], 'c']

对于'bb',输出为'0201','c'为'03'

所以我应该怎么做?

2 个答案:

答案 0 :(得分:2)

听起来你在列表中搜索每个子字符串。你怎么建立一个dict来查找键。因为你仍然需要开始搜索最长的子键。

L = ['a', 'b',['aa','bb','cc'], 'c']

def lookups( L ):
    """ returns `item`, `code` tuples """
    for i, item in enumerate(L):
        if isinstance(item, list):
            for j, sub in enumerate(item):
                yield sub, "%02d%02d" % (i,j)
        else:
            yield item, "%02d" % i

然后,您可以使用以下内容查找子字符串:

lookupdict = dict(lookups(L))
print lookupdict['bb'] # but you have to do 'bb' before trying 'b' ...

但是如果密钥长度不只是1或2,那么将项目分组为单独的dicts也是有意义的,其中每个密钥具有相同的长度。

答案 1 :(得分:1)

如果必须使用此数据结构:

from collections import MutableSequence

def scanList( command, theList ):
    for i, elt in enumerate( theList ):
        if elt == command:
            return ( i, None )
        if isinstance( elt, MutableSequence ):
            for j, elt2 in enumerate( elt ):
                if elt2 == command:
                    return i, j

L = ['a', 'b',['aa','bb','cc'], 'c']
print( scanList( "bb", L ) )
# (2, 1 )
print( scanlist( "c", L ) )
# (3, None )

BUT

这是一个糟糕的数据结构。你能以更好的形式获得这些数据吗?