2014-09-01 192 views
0

列表中的其他元素的子列表中的所有元素,我有以下列表:刪除在蟒蛇

people = ['John', 'Maurice Smith', 'Sebastian', 'Maurice', 'John Sebastian', 'George', 'George Washington'] 

正如你可以看到,JohnMauriceSebastianGeorge是名字或姓氏的全名(Maurice Smith,Jogn SebastianGeorge Washington)。

我想只得到全名。這在Python中可能嗎?

+0

你已經試過了什麼? – wRAR 2014-09-01 04:44:10

回答

3

你可以用這個列表理解其刪除:

[p for p in people if not any(p in p2 for p2 in people if p != p2)] 

這遍歷每個人p,然後檢查條件:

not any(p in p2 for p2 in people if p != p2) 

在每個人p2這個內循環迭代(跳過情況與p相同),並檢查p in p2(是否p是子字符串)。

+0

這將對整個列表中的每個項目執行完整搜索,並且如果其中一個長名稱恰好在另一箇中,則會形成奇怪的怪癖。 – kindall 2014-09-01 04:50:26

+0

@ kindall a)是的。有沒有更快的算法可用(比n^2更快)? b)這恰好符合OP的要求(如標題所述)。如果一個長名稱包含在另一個名稱中,它將刪除前者。 – 2014-09-01 04:53:17

+0

@kindall當然,算法可以存儲每個元素的每個可能子字符串的字典。我懷疑這會提高大多數實際列表長度的性能,並且非常懷疑這會增加複雜性。 – 2014-09-01 04:56:49

0
# make set of first names from full names 
firstnames = set(name.split[0] for name in people if " " in name) 

# get names that aren't in the above set 
people[:] = (name for name in people if name not in firstnames)