如何使用复杂列表中的数字作为标题/如何仅打印与某个值匹配的列表的一部分

时间:2019-01-09 13:02:03

标签: python python-3.x list loops nested-lists

我有一个包含另一个列表的复杂列表。每个列表构成一个集合的一部分(在程序的另一部分中,它一次读取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} ')

4 个答案:

答案 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]]