我使用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个小时.有没有办法让这更快?这可能是我忽视的非常明显的事情.
谢谢!
我有这些数据:
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".
我想这是一个学术问题,但第二个结果对我来说没有意义.它不应该像第一个一样彻底空洞吗?这种行为的理由是什么?
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产品的讨论提供了一个明确的陈述:
没有集合的笛卡尔积......是包含空元组的单例集.
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) 我没有得到我应该从标题中的该函数获得的结果数量,所以我希望得到你的帮助.
查看文档 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 3,我试图找到一种方法来获取列表的所有排列,同时执行一些约束.
例如,我有一个清单 L=[1, 2, 3, 4, 5, 6, 7]
我想找到所有的排列.但是,我的约束是:
当然,我可以生成所有排列并忽略那些不遵循这些约束的排列,但我认为这不会有效.
我有这样的文本文件:
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 …
假设我有一个列表:
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)
理想情况下,我正在寻找一个简洁的表达,我可以在理解中使用.
我很好奇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) 给定一对对列表xys,将其解压缩为两个列表的Python成语是:
xs, ys = zip(*xys)
Run Code Online (Sandbox Code Playgroud)
如果xys是迭代器,我如何将其解压缩为两个迭代器,而不将所有内容存储在内存中?
我正在寻找Python zip和zip_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 ×10
python-itertools ×10
generator ×2
combinations ×1
complement ×1
iterator ×1
numpy ×1
permutation ×1
python-2.x ×1
sequence ×1