[英]Filter a tuple with another tuple in Python
我有一個使用zip
函數創建的元組列表。 zip
匯集了四個列表: narrative
, subject
, activity
和filer
,每個列表只是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.