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]将丢失)。