python 固定的动态字符串列表数组

python fixed array of dynamic strings list

我想迭代地填充一个固定大小的数组,其中每个项目都是一个字符串列表。例如,让我们考虑以下字符串列表:

arr = ['A1', 'C3', 'B2', 'A2', 'C1', 'A3', 'B1', 'C2', 'A4']

我想获取以下 3 个项目的数组(不需要排序):

res = [['A1', 'A2', 'A3', 'A4'],
       ['B2', 'B1'],
       ['C3', 'C1', 'C2']]

我有如下一段代码:

arr = ['A1', 'C3', 'B2', 'A2', 'C1', 'A3', 'B1', 'C2', 'A4']
res = [[]] * 3
for i in range(len(arr)):
    # Calculate index corresponding to A, B or C
    j = ord(arr[i][0])-65
    # Extend corresponding string list
    res[j].extend([arr[i]])

for i in range(len(res)):
    print(res[i])

但我得到了这个结果:

['A1', 'C3', 'B2', 'A2', 'C1', 'A3', 'B1', 'C2', 'A4']
['A1', 'C3', 'B2', 'A2', 'C1', 'A3', 'B1', 'C2', 'A4']
['A1', 'C3', 'B2', 'A2', 'C1', 'A3', 'B1', 'C2', 'A4']

请问我哪里错了? 感谢您的帮助!

您可以使用 itertools.groupby and group the elements in the list (having been sorted) according to the first element. You can use operator.itemgetter 有效地获取每个字符串中的第一个子字符串:

from itertools import groupby
from operator import itemgetter

[list(v) for k,v in groupby(sorted(arr), key=itemgetter(0))]
# [['A1', 'A2', 'A3', 'A4'], ['B1', 'B2'], ['C1', 'C2', 'C3']]

您可以使用列表理解:

[[k for k in arr if k[0]==m] for m in sorted(set([i[0] for i in arr]))]

输出 :

[['A1', 'A2', 'A3', 'A4'], ['B2', 'B1'], ['C3', 'C1', 'C2']]

出现问题的原因如下: res = [[]] * 3 将创建三个列表,但所有三个都是 相同的 对象。因此,无论何时附加或扩展其中之一,它都会被添加到 "all"(毕竟它们都是同一个对象)。

您可以通过将其替换为以下内容来轻松检查: res = [[],[],[]] 然后会给你预期的答案。

考虑这些片段:

res = [[]]*2
res[0].append(1)
print(res)

Out:
[[1], [1]]

同时

res = [[],[]]
res[0].append(1)
print(res)

Out:
[[1], []]

或者您可以像这样创建嵌套列表:res = [[] for i in range(3)]