簡體   English   中英

如何使用復雜列表中的數字作為標題/如何僅打印與某個值匹配的列表的一部分

[英]How do I use a number from a complex list as a heading / How do I print only part of a list that matches a certain value

我有一個包含另一個列表的復雜列表。 每個列表構成一個集合的一部分(在程序的另一部分中,它一次讀取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} ')

讓我們使用字典來解決這個問題。

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)

這樣,詞典中的每個條目都是一個設定的數字。 它包含該號碼的清單列表,因此在處理每個清單之前,您要知道設定的號碼是多少。

您可以使用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

使用您的方法,可以通過臨時存儲完整的“集合”(實際上是此處的列表)來解決此問題:

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)。

這是我基於字典的方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM