可以做更多的pythonic?

时间:2015-03-10 19:15:58

标签: python string list

这是我的代码:

for x in range(len(patterns)):
    for y in range(len(patterns[x])):
        patterns[x][y] = list(patterns[x][y])

它需要作为模式:

[['oxooo', 'oxoxo'], ['oxooo']]

并将其作为模式:

[[['o', 'x', 'o', 'o', 'o'], ['o', 'x', 'o', 'x', 'o']], [['o', 'x', 'o', 'o', 'o']]]

对我来说,看起来不是pythonic。可以做得更好吗?输出应该相同。

4 个答案:

答案 0 :(得分:5)

list comprehension是您正在寻找的。

[[list(z) for z in y] for y in x]

答案 1 :(得分:2)

这是一个通用的递归解决方案,可以在列表中任意嵌套字符串。

def listify(x):
    if isinstance(x, str):
        return list(x)
    else:
        return [listify(i) for i in x]

>>> l = [['oxooo', 'oxoxo'], ['oxooo']]
>>> listify(l)
[[['o', 'x', 'o', 'o', 'o'], ['o', 'x', 'o', 'x', 'o']], [['o', 'x', 'o', 'o', 'o']]]

答案 2 :(得分:2)

在您的示例中,您有两个级别的嵌套列表。如果情况总是如此,您可以使用列表理解:

[[list(p) for p in pp] for pp in patterns]

如果您不知道自己有多少级别,则需要使用递归函数,例如:

def expand_str(v):
    if isinstance(v, str): # basestring for python2
        return list(v)
    else: # assume that otherwise v is iterable
        return [expand_str(vv) for vv in v]

答案 3 :(得分:0)

如果您想修改原始列表,请使用enumerate

for ind, ele in enumerate(l):
    l[ind] = [list(s) for s in ele]
print(l)
[[['o', 'x', 'o', 'o', 'o'], ['o', 'x', 'o', 'x', 'o']], [['o', 'x', 'o', 'o', 'o']]]

您还可以使用map枚举:

for ind, ele in enumerate(l):
    l[ind] = list(map(list, ele))

您还可以将[:]语法与生成器表达式或列表推导一起使用来更改原始列表:

l[:] = [list(map(list,ele)) for ele in l]

l[:] = (list(map(list,ele)) for ele in l)