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

python动态字符串列表的固定数组,python,string,list,extend,Python,String,List,Extend,我想迭代地填充一个固定大小的数组,其中每个项都是字符串列表。例如,让我们考虑下面的字符串列表: arr = ['A1', 'C3', 'B2', 'A2', 'C1', 'A3', 'B1', 'C2', 'A4'] 我想获得以下3个项目的数组(无需订购): 我有以下代码: arr = ['A1', 'C3', 'B2', 'A2', 'C1', 'A3', 'B1', 'C2', 'A4'] res = [[]] * 3 for i in range(len(arr)): # Cal

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

arr = ['A1', 'C3', 'B2', 'A2', 'C1', 'A3', 'B1', 'C2', 'A4']
我想获得以下3个项目的数组(无需订购):

我有以下代码:

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']
请问我哪里错了? 谢谢你的帮助

您可以使用列表中的元素并根据第一个元素对其进行分组(已排序)。可以使用有效地获取每个字符串中的第一个子字符串:

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']]
您可以根据第一个元素使用列表中的元素并将其分组(已排序)。可以使用有效地获取每个字符串中的第一个子字符串:

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']]

您可以使用列表理解:

[[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=[[]对于范围(3)中的i]

问题是由于以下原因造成的:
res=[[]]*3
将创建三个列表,但这三个列表都是相同的对象。因此,无论何时附加或扩展其中一个对象,它都将添加到“all”(毕竟它们都是同一个对象)

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

考虑以下片段:

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

Out:
[[1], [1]]


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

是否要根据元素的第一个字符对元素进行分组?否。条件不同。在我的实际程序中,A1、B1等。。是文件名。无论字符串是什么,这个技巧都必须起作用。答案由John Sloper在评论中给出;-)[编辑:我已通过在扩展函数中的arr[I]周围添加括号修改了初始代码]是否要根据元素的第一个字符对元素进行分组?否。条件不同。在我的实际程序中,A1、B1等。。是文件名。无论字符串是什么,这个技巧都必须起作用。答案由John Sloper在评论中给出;-)[编辑:我修改了我的初始代码,在扩展函数中的arr[I]周围添加了括号]