Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重复列表中的有序对_Python_List Comprehension - Fatal编程技术网

Python 重复列表中的有序对

Python 重复列表中的有序对,python,list-comprehension,Python,List Comprehension,我有一个列表,它可能有重复的元素,也可能没有重复的元素,我希望创建有序的对,这样在元素x重复的情况下,x是一个有效的对,当x 到目前为止,我已经找到了一种非常非蟒蛇式的方法 def foo(a): n = list() for x in range(len(a)): for y in range(x+1,len(a)): if a[x] < a[y]: n.append([a[x],a[y]])

我有一个列表,它可能有重复的元素,也可能没有重复的元素,我希望创建有序的对,这样在元素x重复的情况下,x是一个有效的对,当x 到目前为止,我已经找到了一种非常非蟒蛇式的方法

def foo(a):
    n = list()
    for x in range(len(a)):
        for y in range(x+1,len(a)):
            if a[x] < a[y]:
                n.append([a[x],a[y]])
            else:
                n.append([a[y],a[x]])
    o = list()
    for p in n:
        if not (p in o):
            o.append(p)
    return o

print(foo([1,3,5,-1]))
# [[1, 3], [1, 5], [-1, 1], [3, 5], [-1, 3], [-1, 5]]

print(foo([1,1,5,5]))
# [[1, 1], [1, 5], [5, 5]]

print(foo([1,1,1,1]))
# [[1, 1]]
def foo(a):
n=列表()
对于范围(len(a))内的x:
对于范围(x+1,len(a))内的y:
如果a[x]
我知道我可以使用列表理解,但我尝试的解决方案要么跳过重复出现时的x,x类型,要么跳过不应该出现的幻影x,x

a = [1,3,5,-1]
o = [[x,y] for x in a for y in a if x<=y]
print(o)
[[1, 1], [1, 3], [1, 5], [3, 3], [3, 5], [5, 5], [-1, 1], [-1, 3], [-1, 5], [-1, -1]]
a=[1,3,5,-1]
o=[[x,y]表示a中的x表示a中的y,如果x您是否尝试过使用

像这样的

import itertools
iterable = [1,1,5,5]
r=2
comb = sorted(set(itertools.combinations(sorted(iterable), r)))
for el in comb:
  print(el)

如果您乐于使用itertools,您可以使用:

sorted
的内部调用确保了每一对都将被排序,我理解这是您的意图。对
sorted
的外部调用确保了对的排序。如果没有必要,如果您对
itertools
不满意,您可以将此
sorted
替换为简单的
list

你可以使用列表理解

>>> xs = [1,3,5,-1]
如果您使用其自身的所有子列表压缩
xs
,从索引1、2、…、len(xs)-1开始,您将获得所有组合:

>>> [list(zip(xs,xs[n:])) for n in range(1,len(xs))]
[[(1, 3), (3, 5), (5, -1)], [(1, 5), (3, -1)], [(1, -1)]]
(注意,为了获得更好的输出,我将
zip
包装在
列表中。)
现在,您必须将元组列表展平。这只是对
zip
生成的每个元组列表中的每个元组的列表理解:

>>> [t for ys in [zip(xs,xs[n:]) for n in range(1,len(xs))] for t in ys]
[(1, 3), (3, 5), (5, -1), (1, 5), (3, -1), (1, -1)]
您需要排序的元组:这是
tuple(sorted(t))
,因为sorted返回一个列表。将所有内容放入
集中以删除重复项

>>> set(tuple(sorted(t)) for ys in [zip(xs,xs[n:]) for n in range(1,len(xs))] for t in ys)
{(-1, 1), (1, 3), (-1, 3), (1, 5), (-1, 5), (3, 5)}
(您也可以像silkworm一样,在输出元组之前对列表进行排序。)其他测试用例:

>>> xs = [1,1,1,1]
>>> set(tuple(sorted(t)) for ys in [zip(xs,xs[n:]) for n in range(1,len(xs))] for t in ys)
{(1, 1)}
>>> xs = [1,1,5,5]
>>> set(tuple(sorted(t)) for ys in [zip(xs,xs[n:]) for n in range(1,len(xs))] for t in ys)
{(1, 5), (5, 5), (1, 1)}

建议:你应该使用
itertools
..

你的第一段很混乱,我不理解你的任务。你能编辑并澄清一下吗?如果
iterable
没有排序,这将不会像预期的那样起作用。是的,我没有注意到他希望对它们进行排序。
>>> xs = [1,1,1,1]
>>> set(tuple(sorted(t)) for ys in [zip(xs,xs[n:]) for n in range(1,len(xs))] for t in ys)
{(1, 1)}
>>> xs = [1,1,5,5]
>>> set(tuple(sorted(t)) for ys in [zip(xs,xs[n:]) for n in range(1,len(xs))] for t in ys)
{(1, 5), (5, 5), (1, 1)}