这是我的代码:
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。可以做得更好吗?输出应该相同。
答案 0 :(得分:5)
list comprehension是您正在寻找的。 p>
[[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)