bri*_*enb 5 python tuples list
我有一个使用该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]
Run Code Online (Sandbox Code Playgroud)
现在,我正在将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)]
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚我是怎么做到这一点的.我想要的输出看起来像这样:
reason
# ["subject", "subject, filer", "filer", "subject, activity"]
Run Code Online (Sandbox Code Playgroud)
我对Python有点新手,所以如果解决方案很简单,我会道歉.
将元组存储在字典中以获得更清晰的解决方案:
tups = {'narrative': narrative,
'subject': subject,
'activity': activity,
'filer': filer}
Run Code Online (Sandbox Code Playgroud)
解决方案:
reason = [', '.join(k for k, b in zip(tups, x) if b) for x in zip(*tups.values())]
Run Code Online (Sandbox Code Playgroud)
也可以使用以下方式编写itertools.compress:
from itertools import compress
reason = [', '.join(compress(tups, x)) for x in zip(*tups.values())]
Run Code Online (Sandbox Code Playgroud)
上面的解决方案不保留元组的顺序,例如它们可以返回类似的内容
['subject', 'filer, subject', 'filer', 'activity, subject']
Run Code Online (Sandbox Code Playgroud)
如果需要保留订单,请使用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']
Run Code Online (Sandbox Code Playgroud)
编辑:不涉及字典的解决方案:
from itertools import compress
reason = [', '.join(compress(variables, x))
for x in zip(narrative, subject, activity, filer)]
Run Code Online (Sandbox Code Playgroud)
zip(...)如果一行不再适合调用,请考虑使用字典。
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |