标签: python-itertools

如何从具有不同长度列表的字典中创建词典列表

我想从每个列表创建具有相同索引元素的词典列表。

我有这本字典:

d = {'name': ['bob', 'john', 'harry', 'mary'], 
     'age': [13, 19, 23], 
     'height': [164, 188], 
     'job': ['programmer']}
Run Code Online (Sandbox Code Playgroud)

所需的输出是:

d2 = [{'name': 'bob', 'age': 13, 'height': 164, 'job': 'programmer'}, 
      {'name': 'john', 'age': 19, 'height': 188}, 
      {'name': 'harry', 'age': 23},
      {'name': 'mary'}]
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这样的事情:

d2 = [dict(zip(d, t)) for t in zip(*d.values())]
Run Code Online (Sandbox Code Playgroud)

但是我的输出是:

d2 = [{'name': 'bob', 'age': 13, 'height': 164, 'job': 'programmer'}]
Run Code Online (Sandbox Code Playgroud)

我认为这是因为列表的长度不同而引起的。

python dictionary list-comprehension python-itertools

26
推荐指数
3
解决办法
1064
查看次数

在Python中实现argmax

如何在Python中实现argmax?它应该尽可能高效,因此它应该与iterables一起使用.

可以实施的三种方式:

  • 给定可迭代的对返回对应于最大值的键
  • 给定一个可迭代的值返回最大值的索引
  • 给定一个可重复的键和一个函数f,返回最大的键f(key)

python python-itertools

23
推荐指数
5
解决办法
1万
查看次数

Python的itertools.repeat的目的是什么?

我可以想到的Python itertools.repeat()类的每一个用途,我可以想到另一个同样(可能更多)可接受的解决方案来实现相同的效果.例如:

>>> [i for i in itertools.repeat('example', 5)]
['example', 'example', 'example', 'example', 'example']
>>> ['example'] * 5
['example', 'example', 'example', 'example', 'example']

>>> list(map(str.upper, itertools.repeat('example', 5)))
['EXAMPLE', 'EXAMPLE', 'EXAMPLE', 'EXAMPLE', 'EXAMPLE']
>>> ['example'.upper()] * 5
['EXAMPLE', 'EXAMPLE', 'EXAMPLE', 'EXAMPLE', 'EXAMPLE']
Run Code Online (Sandbox Code Playgroud)

在任何情况下,它是最合适的解决方案吗?如果是这样,在什么情况下呢?

python python-itertools python-3.x

23
推荐指数
3
解决办法
1万
查看次数

分离字符串

给定一个字符串,我想生成所有可能的组合.换句话说,将逗号放在字符串中的所有可能方法.

例如:

input:  ["abcd"]
output: ["abcd"]
        ["abc","d"]
        ["ab","cd"]
        ["ab","c","d"]
        ["a","bc","d"]
        ["a","b","cd"]
        ["a","bcd"]
        ["a","b","c","d"]
Run Code Online (Sandbox Code Playgroud)

我有点坚持如何生成所有可能的列表.组合将只给出包含字符串集子集长度的列表,排列将提供所有可能的订购方式.

由于遍历切片,我可以在列表中只使用一个逗号来创建所有情况,但是我不能用两个逗号来表示例如"ab","c","d"和"a","b" ,"光盘"

我的尝试w/slice:

test="abcd"

for x in range(len(test)):
     print test[:x],test[x:]
Run Code Online (Sandbox Code Playgroud)

python permutation python-itertools

23
推荐指数
2
解决办法
703
查看次数

在维护订单的同时用"压缩"列表列表替换列表清单

我有一个列表列表,如我附上的代码.如果有任何常见值,我想链接每个子列表.然后,我想用列表的精简列表替换列表列表.示例: 如果我有一个[[1,2,3],[3,4]]我想要的列表[1,2,3,4].如果我有[[4,3],[1,2,3]]我想要的[4,3,1,2].如果我有[[1,2,3],[a,b],[3,4],[b,c]]我想要[[1,2,3,4],[a,b,c]]或者[[a,b,c],[1,2,3,4]]我不在乎哪一个.

我几乎在那里......

我的问题是,当我有一个像[[1,2,3],[10,5],[3,8,5]]我想要的情况,[1,2,3,10,5,8]但我得到了我当前的代码[1,2,3,8,10,5]

这是我的代码:

import itertools

a = [1,2,3]
b = [3,4]
i = [21,22]
c = [88,7,8]
e = [5,4]
d = [3, 50]
f = [8,9]
g=  [9,10]
h = [20,21]

lst = [a,b,c,i,e,d,f,g,h,a,c,i]*1000  
#I have a lot of list but not very many different lists

def any_overlap(a, b):
  sb = set(b)
  return any(itertools.imap(sb.__contains__, a))

def find_uniq(lst): …
Run Code Online (Sandbox Code Playgroud)

python algorithm python-2.x nested-lists python-itertools

22
推荐指数
2
解决办法
1664
查看次数

使用sum()连接元组

这篇文章我了解到你可以连接元组:

>>> tuples = (('hello',), ('these', 'are'), ('my', 'tuples!'))
>>> sum(tuples, ())
('hello', 'these', 'are', 'my', 'tuples!')
Run Code Online (Sandbox Code Playgroud)

这看起来很不错.但为什么这有效呢?并且,这是最优的,还是有一些东西itertools比这个结构更可取?

python tuples sum python-itertools

20
推荐指数
2
解决办法
2780
查看次数

如何获取两个列表之间的所有映射?

我们有两个列表,A和B:

A = ['a','b','c']
B = [1, 2]
Run Code Online (Sandbox Code Playgroud)

是否有一种pythonic方法来构建包含2 ^ n的A和B之间的所有映射集(此处为2 ^ 3 = 8)?那是:

[(a,1), (b,1), (c,1)]
[(a,1), (b,1), (c,2)]
[(a,1), (b,2), (c,1)]
[(a,1), (b,2), (c,2)]
[(a,2), (b,1), (c,1)]
[(a,2), (b,1), (c,2)]
[(a,2), (b,2), (c,1)]
[(a,2), (b,2), (c,2)]
Run Code Online (Sandbox Code Playgroud)

使用itertools.product,可以获得所有元组:

import itertools as it
P = it.product(A, B)
[p for p in P]
Run Code Online (Sandbox Code Playgroud)

这使:

Out[3]: [('a', 1), ('a', 2), ('b', 1), ('b', 2), ('c', 1), ('c', 2)]
Run Code Online (Sandbox Code Playgroud)

python list combinatorics python-itertools

19
推荐指数
2
解决办法
1244
查看次数

如何在itertools.takewhile()之后不要错过下一个元素

假设我们希望处理迭代器并希望通过块来处理它.
每个块的逻辑取决于先前计算的块,因此groupby()没有帮助.

在这种情况下,我们的朋友是itertools.takewhile():

while True:
    chunk = itertools.takewhile(getNewChunkLogic(), myIterator)
    process(chunk)
Run Code Online (Sandbox Code Playgroud)

问题是takewhile()需要经过满足新块逻辑的最后一个元素,因此"吃掉"下一个块的第一个元素.

有各种解决方案,包括包装或àC ungetc()等.
我的问题是:有一个优雅的解决方案吗?

python python-itertools

19
推荐指数
1
解决办法
694
查看次数

交错两个字符串的所有可能方法

我试图生成所有可能的方法来交错Python中的任意两个任意字符串.

例如:如果两个字符串是'ab''cd',我希望获得的输出是:

['abcd', 'acbd', 'acdb', 'cabd', 'cadb', 'cdab']
Run Code Online (Sandbox Code Playgroud)

a总是在b(c之前d)之前看到.我正在努力寻找解决方案.我尝试过如下所示的itertools:

import itertools

def shuffle(s,t):
    string = s+t
    for i in itertools.permutations(string):
        print(''.join(i))

shuffle('ab','cd')
Run Code Online (Sandbox Code Playgroud)

但正如预期的那样,这将返回所有可能的排列,而忽略了ab(cd)的顺序.

python permutation python-itertools

19
推荐指数
3
解决办法
7291
查看次数

列表理解从元组列表中提取多个字段

我有一个元组列表

servers = [('server1', 80 , 1, 2), ('server2', 443, 3, 4)]
Run Code Online (Sandbox Code Playgroud)

我想创建一个只有前两个字段的新列表,如:

 [('server1', 80), ('server2', 443)]
Run Code Online (Sandbox Code Playgroud)

但我看不出如何为多个元素制作列表理解.

hosts = [x[0] for x in servers]  # this works to give me ['server1', server2']

hostswithports = [x[0], x[1] for x in servers] # this does not work
Run Code Online (Sandbox Code Playgroud)

我更喜欢学习使用循环的pythonic方式 - 我做错了什么?

python tuples python-itertools

19
推荐指数
4
解决办法
2299
查看次数