Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.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 结果元组中没有重复值的Zip_Python - Fatal编程技术网

Python 结果元组中没有重复值的Zip

Python 结果元组中没有重复值的Zip,python,Python,在使用zip时,是否有一种优雅的或类似python的方法来排除包含重复值的条目 例如: >>> list1 = [0, 1] >>> list2 = [0, 2] >>> zip(list1, list2) [(0, 0), (1, 2)] 我想要第二个元素[(1,2)]。目前,我有 [x代表zip中的x(列表1,列表2),如果len(set(x))==len(x)] 但这感觉有点乏味。有更好的方法吗 编辑:如果有两个以上的列表,我如何将

在使用
zip
时,是否有一种优雅的或类似python的方法来排除包含重复值的条目

例如:

>>> list1 = [0, 1]
>>> list2 = [0, 2]
>>> zip(list1, list2)
[(0, 0), (1, 2)]
我想要第二个元素
[(1,2)]
。目前,我有

[x代表zip中的x(列表1,列表2),如果len(set(x))==len(x)]

但这感觉有点乏味。有更好的方法吗


编辑:如果有两个以上的列表,我如何将其扩展到一般情况

>>> list1 = [0, 1]
>>> list2 = [0, 2]
>>> list3 = [0, 3]
>>> ...
>>> zip(list1, list2, list3, ...)

如果任何条目包含任何重复值,则应将其丢弃(并非元组中的每个值都必须相等)。

您只有两个值元组,因此可以将第一个值与第二个值进行比较。列表理解是最佳选择:

[x for x in zip(list1, list2) if x[0] != x[1]]
对于一般情况,如果您的值都是可散列的,那么您已经有了最好的选择

如果您有不可散列的类型,则需要对“唯一”处理进行特殊处理,因此这超出了此处的范围。

如何

[(x,y) for (x,y) in zip(list1, list2) if x != y]
一般情况:

[x for x in zip(list1, list2, ... listn) if not all(z == x[0] for z in x[1:])]

在每个元素相等的位置查找重复项。如果只有一对需要等于计数为重复,则可以使用问题中提到的set方法,前提是您有可散列类型。如果您有不可损坏的类型,那么前面已经回答了识别重复项的(有趣的)问题

这里还有另一种使用
all
的方法,IMHO,它更清楚地表达了代码的意图:

[x for x in zip(list1, list2) if not all(x[0] == rest for rest in x)]

这样做的好处是,它适用于任意大小的元组(不仅仅是两个元素,您可以使用
zip(list1、list2、list3)
),并且它使用生成器表达式,因此不会创建其他列表、集等。

一般情况下,不可损坏的类型可能会失败。@Martijn yes,但是,例如,在tuples@wim:这就是我收回评论的原因。:-)“独特”处理对特殊情况意味着什么?整数列表,例如,通常按相等进行比较。@wim:您需要将每个元素与其他元素进行比较。对于一个大的列表,使用
itertools.product(elem,2)
循环来比较它们是相当昂贵的,但是将列表转换为
tuple()
,然后使用
len(set())
,这样在计算上会更便宜。对于
dict()。根据Martijn的说法,转换成set似乎是一条路。如果我把所有的都转换成any,我就得到了我想要的!小心点,你不能把它换成任何东西。它不是那么简单。因为这仅与第一个元素进行比较(示例[0,1,1]将丢失)。