Python将字符串转换为字符串列表列表

时间:2014-10-23 16:17:18

标签: python string list

我有当前的字符串:

output = "S.##......\n#.##..###.\n#.###.###.\n#.....###.\n###.#####S"    

我想将其转换为以下列表:

coordinates = [['S', '.', '#', '#', '.', '.', '.', '.', '.', '.'],
               ['#', '.', '#', '#', '.', '.', '#', '#', '#', '.'],
               ['#', '.', '#', '#', '#', '.', '#', '#', '#', '.'],
               ['#', '.', '.', '.', '.', '.', '#', '#', '#', '.'],
               ['#', '#', '#', '.', '#', '#', '#', '#', '#', 'S']]    

基本上每次我得到一个" \ n"我希望它之前的序列像上面一样被拆分并放入一个单独的列表项中。 我尝试了以下方法:

    coordinates = []
    temp = []
    for item in output:
        if item != "\n":
            temp += item
        else:
            coordinates += temp

但它不起作用,也不适用于

.append()

4 个答案:

答案 0 :(得分:5)

使用str.splitlines()在换行符上拆分(以避免产生空的最后一行),然后在每个结果字符串上调用list()。您可以使用list comprehension

在一个表达式中执行此操作
[list(line) for line in output.splitlines()]

在字符串上调用list()会创建单个字符的列表对象:

>>> list('foo')
['f', 'o', 'o']

演示:

>>> from pprint import pprint
>>> output = "S.##......\n#.##..###.\n#.###.###.\n#.....###.\n###.#####S"    
>>> [list(line) for line in output.splitlines()]
[['S', '.', '#', '#', '.', '.', '.', '.', '.', '.'], ['#', '.', '#', '#', '.', '.', '#', '#', '#', '.'], ['#', '.', '#', '#', '#', '.', '#', '#', '#', '.'], ['#', '.', '.', '.', '.', '.', '#', '#', '#', '.'], ['#', '#', '#', '.', '#', '#', '#', '#', '#', 'S']]
>>> pprint(_)
[['S', '.', '#', '#', '.', '.', '.', '.', '.', '.'],
 ['#', '.', '#', '#', '.', '.', '#', '#', '#', '.'],
 ['#', '.', '#', '#', '#', '.', '#', '#', '#', '.'],
 ['#', '.', '.', '.', '.', '.', '#', '#', '#', '.'],
 ['#', '#', '#', '.', '#', '#', '#', '#', '#', 'S']]

您的尝试失败,因为您从未重置temp;每次到达\n时,您都需要创建一个新的空列表,并使用coordinates.append()代替+=(与{相同} {1}}:

coordinates.extend()

您需要最后两行不要错过最后一个coordinates = [] temp = [] for item in output: if item != "\n": temp += item else: coordinates.append(temp) temp = [] if temp: coordinates.append(temp) 字符后的最后一行。

答案 1 :(得分:3)

您可以使用列表推导来生成\n分隔符之间的每个字符列表:

>>> [list(x) for x in output.split('\n')]
[['S', '.', '#', '#', '.', '.', '.', '.', '.', '.'],
 ['#', '.', '#', '#', '.', '.', '#', '#', '#', '.'],
 ['#', '.', '#', '#', '#', '.', '#', '#', '#', '.'],
 ['#', '.', '.', '.', '.', '.', '#', '#', '#', '.'],
 ['#', '#', '#', '.', '#', '#', '#', '#', '#', 'S']]

将字符串x传递给list会返回x中的字符列表。 output.split('\n')是将字符串output分解为由换行符\n分隔的字符串列表的一种方法。

编辑:@MartijnPieters撰写的答案强调了在\n(我承认我不知道)上分裂叮咬的重要一点。

如果您的字符串有一个尾随\n,最好使用output.splitlines()来分割字符串。在这里,使用split('\n')会在最终\n之后返回一个空字符串,而splitlines()会在默认情况下避免这种情况。

答案 2 :(得分:2)

您可以在换行符split'\n'然后转换为列表。

output = "S.##......\n#.##..###.\n#.###.###.\n#.....###.\n###.#####S"
coordinates = [list(s) for s in output.split('\n')]

>>> coordinates
[['S', '.', '#', '#', '.', '.', '.', '.', '.', '.'],
 ['#', '.', '#', '#', '.', '.', '#', '#', '#', '.'],
 ['#', '.', '#', '#', '#', '.', '#', '#', '#', '.'],
 ['#', '.', '.', '.', '.', '.', '#', '#', '#', '.'],
 ['#', '#', '#', '.', '#', '#', '#', '#', '#', 'S']]

答案 3 :(得分:1)

这应该有效:

output = "S.##......\n#.##..###.\n#.###.###.\n#.....###.\n###.#####S"
items = output.split('\n')
final_list = []
for item in items:
    line_list = [c for c in item]
    final_list.append(line_list)


print final_list