簡體   English   中英

使用Python中的另一個元組過濾元組

[英]Filter a tuple with another tuple in Python

我有一個使用zip函數創建的元組列表。 zip匯集了四個列表: narrativesubjectactivityfiler ,每個列表只是0和1的列表。 假設這四個列表看起來像這樣:

narrative = [0, 0, 0, 0]
subject = [1, 1, 0, 1]
activity = [0, 0, 0, 1]
filer = [0, 1, 1, 0]

現在,我將它們zip在一起以獲得一個布爾值列表,指示它們是否為True

ny_nexus = [True if sum(x) > 0 else False for x in zip(narrative, subject, activity, filer)]

我現在遇到的問題是獲得第二個元組列表,如果在迭代期間它具有1,則返回變量的名稱。 我想它看起來像這樣:

variables = ("narrative", "subject", "activity", "filer")
reason = [", ".join([some code to filter a tuple]) for x in zip(narrative, subject, activity, filer)]

我無法弄清楚我是怎么做到這一點的。 我想要的輸出看起來像這樣:

reason
# ["subject", "subject, filer", "filer", "subject, activity"]

我對Python有點新手,所以如果解決方案很簡單,我會道歉。

將元組存儲在字典中以獲得更清晰的解決方案:

tups = {'narrative': narrative,
        'subject': subject,
        'activity': activity,
        'filer': filer}

解決方案:

reason = [', '.join(k for k, b in zip(tups, x) if b) for x in zip(*tups.values())]

它也可以使用itertools.compress編寫:

from itertools import compress
reason = [', '.join(compress(tups, x)) for x in zip(*tups.values())]

上面的解決方案不保留元組的順序,例如它們可以返回類似的東西

['subject', 'filer, subject', 'filer', 'activity, subject']

如果您需要保留訂單,請使用collections.OrderedDict ,如下所示:

from collections import OrderedDict

tups = OrderedDict([
    ('narrative', narrative),
    ('subject', subject),
    ('activity', activity),
    ('filer', filer)
])

# The result is ['subject', 'subject, filer', 'filer', 'subject, activity']

編輯:不涉及字典的解決方案:

from itertools import compress
reason = [', '.join(compress(variables, x))
          for x in zip(narrative, subject, activity, filer)]

如果zip(...)調用不再適合一行,請考慮使用字典。

使用zip(narrative, subject, activity, filer)基本上轉換矩陣(你的矩陣等長列表組成矩陣)。 然后,通過這些枚舉來查找標志為true的位置n並索引相應的變量。

narrative = [0, 0, 0, 0]
subject = [1, 1, 0, 1]
activity = [0, 0, 0, 1]
filer = [0, 1, 1, 0]
variables = ("narrative", "subject", "activity", "filer")
# ========================================================

new_list = [[variables[n] for n, flag in enumerate(indicators) if flag] 
            for indicators in zip(narrative, subject, activity, filer)]
>>> new_list
[['subject'], ['subject', 'filer'], ['filer'], ['subject', 'activity']]

要查看轉置:

>>> [i for i in zip(narrative, subject, activity, filer)]

只有當相應的標志為True時,您才可以使用理解語法的過濾方面來獲取您的可變英語名稱:

variables = ("narrative", "subject", "activity", "filer")
[tuple (name for flag, name in zip(x, variables) if x)  for x in zip(narrative, subject, activity, filer)]

也就是說,你的方法有些可疑 - 你很可能(遠)更好地使用面向對象的方法,而不是試圖為每個主題手動協調獨立的變量序列。

    narrative = [0, 0, 0, 0]
    subject = [1, 1, 0, 1]
    activity = [0, 0, 0, 1]
    filer = [0, 1, 1, 0]
    variables = ("narrative", "subject", "activity", "filer")
    ny_nexus = [True if sum(x) > 0 else False for x in zip(narrative, subject, activity, filer)]
    output = []
    [[output.append(variables[j]) if t==1 else None for j,t in enumerate(x)] for x in zip(narrative, subject, activity, filer)]
    print ny_nexus
    print output

當然,您可以在不使用列表推導的情況下執行以下操作:

    narrative = [0, 0, 0, 0]
    subject = [1, 1, 0, 1]
    activity = [0, 0, 0, 1]
    filer = [0, 1, 1, 0]
    variables = ("narrative", "subject", "activity", "filer")
    ny_nexus = [True if sum(x) > 0 else False for x in zip(narrative, subject, activity, filer)]
    output = []
    for x in zip(narrative, subject, activity, filer):
        for j,t in enumerate(x):
            output.append(variables[j])
    print ny_nexus
    print output

暫無
暫無

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

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