我的示例(列表a和b总是大小相同):
a = ['12','12','12','12','12','23','24','24','31','31']
b = ['1','2','2','2','2','2','5','5','5','5']
c = a, b下面是我的代码,它需要类似于否则的条件,c是这样代码只查看列表a,而不是两个列表,并打印出符合条件的列表a和b的结果。这段代码中的其他条件是错误的,我想不出另一个
d = list(zip(*[(ai,bi) for ai, bi in zip(a,b) if c[0].count(ai) == 5 else 2]))
e = list(zip(*[(ai,bi) for ai, bi in zip(a,b) if c[0].count(ai) == 7 else 2]))是否可以更改条件,以便在我的示例中有超过2个计数时,只打印5的计数?或者,如果初始计数为7,但没有检测到任何计数,则只打印2的计数?
我想要的结果:
d = [('12','12','12','12','12',), ('1','2','2','2','2')]
e = [('24','24','31','31'), ('5','5','5','5')]谢谢!
发布于 2017-08-18 13:17:44
您需要首先计算元素,,然后决定选择哪些元素。使用 object可以有效地计数元素,这样您就可以决定要选择哪些元素:
from collections import Counter
counts = Counter(a)
has_5 = any(c == 5 for c in counts.values())
has_7 = any(c == 7 for c in counts.values())现在,您知道是否有一个元素出现了5次,如果有一个元素出现了7次。现在,您可以根据这些元素出现的次数来筛选它们,而无需重新计算每次迭代的次数。先做出选择,这样就不必让if逻辑复杂化了:
desired_count = 5 if has_5 else 2
d = list(zip(*[(ai,bi) for ai, bi in zip(a,b) if counts[ai] == desired_count]))
desired_count = 7 if has_7 else 2
e = list(zip(*[(ai,bi) for ai, bi in zip(a,b) if counts[ai] == desired_count]))因此,如果有一个元素出现5次,则对这些元素进行筛选,否则对只出现两次的元素进行筛选。
演示:
>>> from collections import Counter
>>> a = ['12','12','12','12','12','23','24','24','31','31']
>>> b = ['1','2','2','2','2','2','5','5','5','5']
>>> counts = Counter(a)
>>> has_5 = any(c == 5 for c in counts.values())
>>> has_7 = any(c == 7 for c in counts.values())
>>> desired_count = 5 if has_5 else 2
>>> list(zip(*[(ai,bi) for ai, bi in zip(a,b) if counts[ai] == desired_count]))
[('12', '12', '12', '12', '12'), ('1', '2', '2', '2', '2')]
>>> desired_count = 7 if has_7 else 2
>>> list(zip(*[(ai,bi) for ai, bi in zip(a,b) if counts[ai] == desired_count]))
[('24', '24', '31', '31'), ('5', '5', '5', '5')]https://stackoverflow.com/questions/45757408
复制相似问题