从可迭代(例如列表或集合)生成伪有序对列表的Pythonic方法

时间:2017-11-08 18:13:55

标签: python

给定一个由一组有限元素组成的可迭代:

  

(a,b,c,d)

作为例子

从上面的iterable中生成以下(伪)有序对的Pythonic方法是什么:

ab
ac
ad
bc
bd
cd

一个简单的方法是使用for循环,但是我想知道是否有一种pythonic方法从上面的iterable生成这个列表?

3 个答案:

答案 0 :(得分:3)

尝试使用combinations

import itertools
combinations = itertools.combinations('abcd', n)

会给你一个迭代器,你可以循环它或将它转换成一个list(combinations)

的列表

为了仅包含示例中的对,您可以传递2作为参数:

combinations = itertools.combinations('abcd', 2)

>>> print list(combinations)
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]

答案 1 :(得分:0)

您可以在列表理解中完成此任务。

data = [1, 2, 3, 4]

output = [(data[n], next) for n in range(0,len(data)) for next in data[n:]]

print(repr(output))

将理解分开,它构成了iterable的第一个成员的元组,以及由iterable的所有其他成员组成的列表中的第一个对象。 data[n:]告诉Python在第n次之后接受所有成员。

Here it is in action.

答案 2 :(得分:0)

使用列表推导 - 它们似乎被认为是pythonic。

my favorite spot to photograph sunrises

以字符串格式获取n位二进制数,其中只有两个数字一个,n是项目的长度。

stuff = ('a','b','c','d')

为每个组合找到 1 的索引。

n = len(stuff)
s = '{{:0{}b}}'.format(n)
z = [s.format(x) for x in range(2**n) if s.format(x).count('1') ==2]

使用索引选择项目,然后排序。

y = [[i for i, c in enumerate(combo) if c == '1'] for combo in z]