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)]
我想迭代地填充一个固定大小的数组,其中每个项目都是一个字符串列表。例如,让我们考虑以下字符串列表:
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)]