检查元组列表中元组的第二个元素是否完全相同

时间:2014-08-29 18:46:15

标签: python

我想检查一下元组列表中元组的第二个元素是否完全相同

features = [(a,b), (c,b), (a,d)]

元组的第一个元素可能不同。

x = []
for feature, geom_type in features:
    x.append(geom_type)
y = collections.Counter(x)
print len([i for i in y if y[i]>1])

2 个答案:

答案 0 :(得分:5)

你的事情太复杂了。您只需要一个集合,然后测试集合是否只包含一个元素:

len({g for f, g in features}) <= 1

{expr for targets in iterable}构造是set comprehension;它从元组中的所有第二个元素构建一个集合。它只包含独特的元素;如果它的长度不是1则会有不同的值。

如果features非常大,你可能想要提早纾困而不是遍历所有元素;一些itertools魔术可以做到这一点:

from itertools import dropwhile

def unique(it):
    it = iter(it)
    try:
        next(dropwhile(lambda e, f=next(it): e == f, it))
    except StopIteration:
        return True
    else:
        return False

然后用作:

if unique(g for f, g in features):

dropwhile()返回的下一个元素不等于it iterable中的第一个值。如果没有这样的元素,则会引发StopIteration,并且我们知道整个iterable只包含一个值。如果没有提出StopIteration,我们发现它并不是唯一的证据。

如果True中没有任何元素,它还会返回it

演示:

>>> features = [('a', 'b'), ('c', 'b'), ('a', 'd')]
>>> len({g for f, g in features}) <= 1
False
>>> unique(g for f, g in features)
False
>>> features = [('a', 'b'), ('c', 'b'), ('a', 'b')]
>>> len({g for f, g in features}) <= 1
True
>>> unique(g for f, g in features)
True

答案 1 :(得分:1)

对于非常长的列表,构建完整集合效率不高,因为只要&#34;不匹配&#34;就可以中止。遇到了。在这种情况下,需要考虑一个普通的命令循环:

def check_if_second_are_same(lst):
    for item in lst:
        if item[1] != lst[0][1]:
            return False
    return True