Как использовать номер из сложного списка в качестве заголовка / Как распечатать только часть списка, которая соответствует определенному значению - PullRequest
0 голосов
/ 09 января 2019

У меня сложный список, который содержит другой список. Каждый список является частью набора (В другой части программы он считывает по 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

Это устанавливается в переменную «History», которая запоминает все наборы и их входы до очистки, сохраняется как [[input] 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, в то время как циклы (этот только ухудшает ситуацию), я не могу заставить его вести себя так, как я ожидаю. В настоящее время мой базовый код ниже.

Я так уверен, что упускаю что-то простое или использую неправильный тип объекта, но на всю жизнь решение ускользнуло от меня и сводит меня с ума.

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 голосов
/ 09 января 2019

Вот мой подход, основанный на словаре:

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]]                                    
0 голосов
/ 09 января 2019

Вы можете использовать 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
0 голосов
/ 09 января 2019

Используя ваш подход, вы можете решить эту проблему, временно сохранив полный «набор» (на самом деле это список здесь):

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) для вашего случая.

0 голосов
/ 09 января 2019

Давайте решим это, используя словарь.

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)

Таким образом, каждая запись в словаре является заданным числом. Он содержит список списков для этого номера, поэтому вы знаете, какой номер набора, прежде чем обрабатывать каждый список.

...