Python 如何对使用特定索引值的产品使用itertools?
以下代码输出:Python 如何对使用特定索引值的产品使用itertools?,python,list,product,indexof,itertools,Python,List,Product,Indexof,Itertools,以下代码输出: import itertools as it list(it.product(['A', 'T'], ['T', 'G'])) Out[230]: [('A', 'T'), ('A', 'G'), ('T', 'T'), ('T', 'G')] 但是,如果列表是: ['A', '/', 'T'], ['T', '/', 'G'] ['C', '|', 'T'], ['A', '|', 'C'] 我想要 [('A', 'T'), ('A', 'G'), ('T', 'T'),
import itertools as it
list(it.product(['A', 'T'], ['T', 'G']))
Out[230]: [('A', 'T'), ('A', 'G'), ('T', 'T'), ('T', 'G')]
但是,如果列表是:
['A', '/', 'T'], ['T', '/', 'G']
['C', '|', 'T'], ['A', '|', 'C']
我想要
[('A', 'T'), ('A', 'G'), ('T', 'T'), ('T', 'G')]
[('C', 'A'), ('T', 'C')]
这意味着:
list(it.product(['A', '/', 'T'], ['T', '/', 'G'])) if '/' in the list
else list(it.product(['A', '/', 'T'], ['T', '/', 'G'])) if '|' in the list
如何在不删除/
和|
的情况下获得相同的结果,因为这是一个条件
我认为使用索引可能有效,并尝试了以下方法:
list(it.product(['A', '/', 'T'], ['T', '/', 'G']).index([0,2))
和其他几个过程,但没有帮助
此代码是一个大代码的尾部,因此我不尝试构建任何函数或删除
/
您可以应用过滤器
:
>>> from itertools import product
>>> list(filter(lambda x: '/' not in x, product(['A', '/', 'T'], ['T', '/', 'G'])))
[('A', 'T'), ('A', 'G'), ('T', 'T'), ('T', 'G')]
或者事先排除它们(这次我使用了与过滤器相当的方法:有条件的理解):
请注意,当您将其与枚举
结合使用时,也可以使用索引进行筛选:
list(product([item for idx, item in enumerate(a) if idx != 1],
[item for idx, item in enumerate(b) if idx != 1]))
或者,如果对索引有简单的条件,则对列表进行切片也是一个选项:
>>> list(product(a[:2], b[:2]))
[('A', 'T'), ('A', '/'), ('/', 'T'), ('/', '/')]
我更新了一点情况。请你再看看这个问题。你能澄清一下实际情况吗?我当时的印象是我理解你的意思-但是考虑到你的新例子(['C'、'.'T'、'T']、['A'、'.'、'C']
):有什么规则吗?你的意思是:[zip中的项目(['A'、'.'、'T']、['T'、'T'、'T'、'G'])如果项目中没有“
?但现在这是一个完全不同的问题applymap
并不等同于pythons过滤器,因此它甚至与答案无关。你能再问一个问题吗?只需猜测一下.applymap(lambda c:','.join('g'。如果'/'不在t中,则连接(t)表示t.product(*c)如果'/'不在t中))
.applymap(lambda c:','.join('g'.join(t)表示t在it中。product(*c)如果'/'不在t中,则连接(t)如果'/'在c中,则连接('else')。'?还有一个建议:请提出一个新问题。你可以明确地链接到这个问题和其他问题,但是如果你每个问题只问一个问题,你可能会得到更好的答案。
>>> list(product(a[:2], b[:2]))
[('A', 'T'), ('A', '/'), ('/', 'T'), ('/', '/')]