我有一个包含另一个列表的复杂列表。每个列表构成一个集合的一部分(在程序的另一部分中,它一次读取3个值,如果您有2个加载的3个值,则将它们分别设置为一个集合。 例如,下面是我的第一组输入:
12, 11, 1
12, 6, 2
8, 7, 1
然后我的第二组输入是:
6, 6, 1
因此,每个输入实际上都是集合的一部分:
Set 1:
12, 11, 1
12, 6, 2
8, 7, 1
Set 2:
6, 6, 1
将其设置为“历史”变量,该变量将记住所有设置及其输入,直到清除为止,并存储为[[inputs] setnumber],其中外部项是设置号,内部项是接收到的输入在那个背景上:
[[12, 11, 1], 1]
[[12, 6, 2], 1]
[[8, 7, 1], 1]
[[6, 6, 1], 2]
我需要做的是将它们打印为以下格式:
Starting with set 1:
12, 11, 1
12, 6, 2
8, 7, 1
Starting with set 2:
6, 6, 1
相反,我得到的是:
Starting with set 1
The Following appear:12,11,1
Starting with set 1
The Following appear:12,6,2
Starting with set 1
The Following appear:8,7,1
Starting with set 2
The Following appear:6,6,1
无论我多么努力或多次尝试一些if语句,而while循环(这只会使事情变得更糟),我无法使其表现得像我期望的那样。目前,我的基本代码如下。
我非常确定自己缺少简单的东西或使用了错误类型的对象,但是对我而言,解决方案使我望而却步,并使我发疯。
SetHistory = [[[12, 11, 1], 1], [[12, 6, 2], 1], [[8, 7, 1], 1], [[6, 6, 1], 2]]
for Results, Set_Number in SetHistory:
UnpackResults = [Results]
UnpackSet = [Set_Number]
for i in UnpackSet:
print(f'Starting with set {Set_Number}')
for i, v, x in UnpackResults:
print(f'The Following appear:{i},{v},{x} ')
答案 0 :(得分:1)
让我们使用字典来解决这个问题。
SetHistory = [[[12, 11, 1], 1], [[12, 6, 2], 1], [[8, 7, 1], 1], [[6, 6, 1], 2]]
set_dict = {}
for Results, Set_Number in SetHistory:
if Set_Number in set_dict:
set_dict[Set_Number].append(Results)
else:
set_dict[Set_Number] = [Results]
for a_set in sorted(set_dict):
print('Set '+str(a_set))
for val_list in set_dict[a_set]:
print(*val_list)
通过这种方式,词典中的每个条目都是一个固定编号。它包含该编号的列表,因此在处理每个列表之前,您要知道设置的编号。
答案 1 :(得分:1)
您可以使用itertools.groupby
将“输入”按“集合”数字分组,如下所示:
from itertools import groupby
from operator import itemgetter
set_history = [[[12, 11, 1], 1], [[12, 6, 2], 1], [[8, 7, 1], 1], [[6, 6, 1], 2]]
for key, group in groupby(set_history, key=itemgetter(1)):
print(f'Starting with set {key}:')
for item in group:
print(*item[0], sep=", ")
给予:
Starting with set 1:
12, 11, 1
12, 6, 2
8, 7, 1
Starting with set 2:
6, 6, 1
答案 2 :(得分:0)
使用您的方法,可以通过临时存储完整的“集合”(实际上是此处的列表)来解决该问题:
SetHistory = [[[12, 11, 1], 1], [[12, 6, 2], 1], [[8, 7, 1], 1], [[6, 6, 1], 2]]
UnpackResults = []
Set_Number_old = 1
for Results, Set_Number in SetHistory:
if Set_Number_old == Set_Number:
UnpackResults.append(Results)
else:
print('Starting with set {}'.format(Set_Number_old))
for i, v, x in UnpackResults:
print('The Following appear:{},{},{} '.format(i, v, x))
Set_Number_old = Set_Number
UnpackResults = [Results]
print('Starting with set {}'.format(Set_Number_old))
for i, v, x in UnpackResults:
print('The Following appear:{},{},{} '.format(i, v, x))
您的SetHistory
的形状为(4,2)。在for Results, Set_Number in SetHistory:
中,您只需获取每次迭代中集合的编号,然后立即打印它。您实际上想存储与该特定集合相对应的所有结果,并在到达下一个集合时将其打印出来。
对于您的情况,我建议使用字典(https://docs.python.org/3/tutorial/datastructures.html?highlight=dictionary参见5.5)。
答案 3 :(得分:0)
这是我基于字典的方法:
d = dict()
for res, n in SetHistory:
d[n] = d.get(n, []) + [res]
for k, v in d.items():
print(f'set {k}:')
print(v)
# set 1:
# [[12, 11, 1], [12, 6, 2], [8, 7, 1]]
# set 2:
# [[6, 6, 1]]