我想檢查是否在元組的列表元組的第二個元素都是相同的檢查,如果在元組的列表元組的第二個元素都是相同的
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])
我想檢查是否在元組的列表元組的第二個元素都是相同的檢查,如果在元組的列表元組的第二個元素都是相同的
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])
你太過於複雜了。所有你需要的是一組,然後測試該組只包含一個元素:
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
迭代的第一個值的下一個元素。如果沒有這樣的元素,StopIteration
被提出,我們知道整個迭代只包含一個值。如果沒有提出StopIteration
,我們發現它不是唯一的證據。如果it
中根本沒有元素,它也會返回True
。
演示:
>>> 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
請注意,如果'features'是一個空列表,這會給你一個'False'結果 - 這可能是你想要的,但它不遵循'all()'和'any( )'。如果你確實想讓空列表通過,只需使它成爲'<= 1'。 – 2014-08-29 18:54:56
@Lattyware:不錯的一個; 'unique()'可迭代的工作方式像'all()'和'any()';它會爲空的迭代返回「True」。 – 2014-08-29 18:58:52
對於很長列表,它是沒有效率建立了一套完整的,你能儘快爲「不匹配」遇到中止。在這種情況下,一個普通的老式命令循環將被考慮:
def check_if_second_are_same(lst):
for item in lst:
if item[1] != lst[0][1]:
return False
return True
第一個'len(lst)'不是真的需要,因爲如果沒有任何東西可以循環,最終會在'return True'處結束。如果'lst'是* large *,那麼不要使用切片來創建一個全新的副本減去第一個元素。 – 2014-08-29 19:07:52
值得注意的是,雖然這是懶惰的,但它仍然需要一個序列(這意味着它不是內存有效的,除非你已經有一個列表進入 - 如果你的迭代和你所說的一樣大,那麼可能是一個問題)。 Martijn Pieter的懶惰解決方案可以在任意迭代器上工作,而不需要將所有內容一次全部存儲在內存中。使用'dropwhile()'也可以避免使用較慢的Python循環來支持本地實現。 – 2014-09-04 11:31:25
你有沒有嘗試過自己呢? – 2014-08-29 18:47:09
到目前爲止你做了什麼?你有特定的問題嗎? – bvidal 2014-08-29 18:47:20