标签: python-itertools

itertools产品加速

我使用itertools.product生成长度为13的4个元素的所有可能变体.4和13可以是任意的,但实际上,我得到4 ^ 13个结果,这是很多.我需要将结果作为Numpy数组,目前执行以下操作:

  c = it.product([1,-1,np.complex(0,1), np.complex(0,-1)], repeat=length)
  sendbuf = np.array(list(c))
Run Code Online (Sandbox Code Playgroud)

有一些简单的分析代码介于两者之间,看起来第一行几乎是瞬时的,而转换为列表然后Numpy数组需要大约3个小时.有没有办法让这更快?这可能是我忽视的非常明显的事情.

谢谢!

python numpy python-itertools

11
推荐指数
3
解决办法
6459
查看次数

itertools.groupby()没有正确分组

我有这些数据:

self.data = [(1, 1, 5.0),
             (1, 2, 3.0),
             (1, 3, 4.0),
             (2, 1, 4.0),
             (2, 2, 2.0)]
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时:

for mid, group in itertools.groupby(self.data, key=operator.itemgetter(0)):
Run Code Online (Sandbox Code Playgroud)

因为list(group)我得到:

[(1, 1, 5.0),
 (1, 2, 3.0),
 (1, 3, 4.0)]
Run Code Online (Sandbox Code Playgroud)

这就是我想要的.

但是,如果我使用1而不是0

for mid, group in itertools.groupby(self.data, key=operator.itemgetter(1)):
Run Code Online (Sandbox Code Playgroud)

按元组中的第二个数字分组,我只得到:

[(1, 1, 5.0)]
Run Code Online (Sandbox Code Playgroud)

即使有其他元组在1(第二)位置有"1".

python python-itertools

11
推荐指数
2
解决办法
1万
查看次数

当提供空列表时,itertools.product()会产生什么?

我想这是一个学术问题,但第二个结果对我来说没有意义.它不应该像第一个一样彻底空洞吗?这种行为的理由是什么?

from itertools import product

one_empty = [ [1,2], [] ]
all_empty = []

print [ t for t in product(*one_empty) ]  # []
print [ t for t in product(*all_empty) ]  # [()]
Run Code Online (Sandbox Code Playgroud)

更新

感谢所有的答案 - 非常有用.

维基百科对Nullary Cartesian产品的讨论提供了一个明确的陈述:

没有集合的笛卡尔积......是包含空元组的单例集.

这里有一些代码可以用来处理来自sth的深刻答案:

from itertools import product

def tproduct(*xss):
    return ( sum(rs, ()) for rs in product(*xss) )

def tup(x):
    return (x,)

xs = [ [1, 2],     [3, 4, 5]       ]
ys = [ ['a', …
Run Code Online (Sandbox Code Playgroud)

python python-itertools cross-product

10
推荐指数
1
解决办法
2140
查看次数

Python itertools.combinations的结果

我没有得到我应该从标题中的该函数获得的结果数量,所以我希望得到你的帮助.

查看文档 http://docs.python.org/library/itertools.html#itertools.combinations 应该是结果的数量

返回的商品数量是n!/ r!/(nr)!当0 <= r <= n时,当r> n时为零.

它适用于那里的例子

组合('ABCD',2) - > AB AC AD BC BD CD

因为n!/ r!/(nr)!= 4!/ 2!/ 2!= 6

但是,如果我尝试

combinations('ABCDEF', 3) --> AB AC AD AE AF BC BD BE BF CD CE CF DE DF EF
Run Code Online (Sandbox Code Playgroud)

我得到了15个结果.但是n!/ r!/(nr)!= 6!/ 3!/(6-3)!= 720/6/6 = 20

所以:Python Docs告诉我,我应该有20个结果,但我得到15个.

你能帮我理解我错过的东西吗?也许是我的数学中的东西,因为该公式应该是正确的,因为它在维基百科组合条目中

谢谢,P

python combinations python-itertools

10
推荐指数
1
解决办法
2万
查看次数

具有约束的Python排列

我正在使用python 3,我试图找到一种方法来获取列表的所有排列,同时执行一些约束.

例如,我有一个清单 L=[1, 2, 3, 4, 5, 6, 7]

我想找到所有的排列.但是,我的约束是:

  • 1应始终在2之前.
  • 3应该在4之前,而5应该在5之前.
  • 最后,6应该在7之前.

当然,我可以生成所有排列并忽略那些不遵循这些约束的排列,但我认为这不会有效.

python permutation python-itertools

10
推荐指数
1
解决办法
4591
查看次数

itertools.takewhile在生成器函数中 - 为什么它只被评估一次?

我有这样的文本文件:

11
2
3
4

11

111
Run Code Online (Sandbox Code Playgroud)

使用Python 2.7,我想把它变成一个行列表列表,其中换行符分隔内部列表中的项目,空行划分外部列表中的项目.像这样:

[["11","2","3","4"],["11"],["111"]]
Run Code Online (Sandbox Code Playgroud)

为此,我编写了一个生成器函数,一旦传递一个打开的文件对象,就会一次生成一个内部列表:

def readParag(fileObj):
    currentParag = []
    for line in fileObj:
        stripped = line.rstrip()
    if len(stripped) > 0: currentParag.append(stripped)
    elif len(currentParag) > 0:
        yield currentParag
        currentParag = []
Run Code Online (Sandbox Code Playgroud)

这工作正常,我可以从列表理解中调用它,产生所需的结果.然而,随后我发现我可能能够更简洁地使用相同的东西itertools.takewhile(为了将生成器函数重写为生成器表达式,但我们现在将保留它).这是我试过的:

from itertools import takewhile    
def readParag(fileObj):
    yield [ln.rstrip() for ln in takewhile(lambda line: line != "\n", fileObj)]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,生成的生成器只产生一个结果(预期的第一个结果,即["11","2","3","4"]).我曾希望next再次调用它的方法会使它takewhile(lambda line: line != "\n", fileObj)再次对文件的其余部分进行评估,从而导致它产生另一个列表.但不是:我得到了一个StopIteration.所以我猜测take while表达式只在生成生成器对象时被评估过一次,而不是每次我都调用生成的生成器对象的next方法.

这个假设让我想知道如果再次调用生成器函数会发生什么.结果是它创建了一个新的生成器对象,["11"]在向StopIteration …

python generator python-itertools

10
推荐指数
3
解决办法
3809
查看次数

在列表中迭代(item,others)

假设我有一个列表:

l = [0, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

如何迭代列表,从列表中获取每个项目及其补充?那是,

for item, others in ...
    print(item, others)
Run Code Online (Sandbox Code Playgroud)

会打印

0 [1, 2, 3]
1 [0, 2, 3]
2 [0, 1, 3]
3 [0, 1, 2]
Run Code Online (Sandbox Code Playgroud)

理想情况下,我正在寻找一个简洁的表达,我可以在理解中使用.

python sequence complement python-itertools

10
推荐指数
1
解决办法
196
查看次数

itertools.imap vs映射整个iterable

我很好奇http://docs.python.org/2/library/itertools.html#itertools.imap上的一条声明,即它描述了

sum(imap(operator.mul, vector1, vector2))
Run Code Online (Sandbox Code Playgroud)

作为一个有效的点产品.我的理解是imap给出了一个生成器而不是一个列表,虽然我理解如果你只考虑前几个元素,周围的sum(),它会更快/消耗更少的内存,我不知道如何它的行为与:

sum(map(operator.mul, vector1, vector2))
Run Code Online (Sandbox Code Playgroud)

python python-2.x python-itertools

10
推荐指数
2
解决办法
7614
查看次数

如何解压缩迭代器?

给定一对对列表xys,将其解压缩为两个列表的Python成语是:

xs, ys = zip(*xys)
Run Code Online (Sandbox Code Playgroud)

如果xys是迭代器,我如何将其解压缩为两个迭代器,而不将所有内容存储在内存中?

python iterator generator python-itertools

10
推荐指数
2
解决办法
3362
查看次数

zip_longest没有填充值

我正在寻找Python zipzip_longest函数之间的中间点(来自itertools模块),它耗尽了所有给定的迭代器,但没有填充任何东西.因此,例如,它应该像这样转置元组:

(11, 12, 13    ),        (11, 21, 31, 41),
(21, 22, 23, 24),  -->   (12, 22, 32, 42),
(31, 32        ),        (13, 23,     43),
(41, 42, 43, 44),        (    24,     44)
Run Code Online (Sandbox Code Playgroud)

(添加了空格以实现更好的图形对齐.)

我设法通过清理fillvalues后来制定原始解决方案zip_longest.

def zip_discard(*iterables, sentinel = object()):
    return map(
            partial(filter, partial(is_not, sentinel)), 
            zip_longest(*iterables, fillvalue=sentinel))
Run Code Online (Sandbox Code Playgroud)

有没有办法在不引入哨兵的情况下做到这一点?可以使用改进yield吗?哪种方法最有效?

python functional-programming python-itertools

10
推荐指数
2
解决办法
2009
查看次数