2017-02-12 61 views
2

我正在寫一個函數,它將一個列表作爲參數。此參數是字符串列表的列表,每個字符串包含由空格分隔的第一個和最後一個名稱。如果第一個名字重複,我應該檢查每個列表,如果是,則創建一個包含重複名稱的新列表。這個詞只有在它的子列表中重複時纔會重複。例如。在列表中操作字符串

>>>findAgents([["John Knight", "John Doe", "Erik Peterson"],["Fred Douglas", "John Stephans", "Mike Dud", "Mike Samuels"]]) 

會產生

['John', 'Mike'] 

到目前爲止,我已經能夠通過列表進行迭代,並訪問名字。但我不知道如何組織它們,以便將它們保留在自己的區域,這樣我就可以檢查該區域是否有重複。這是我的代碼:

def findAgents(listOlists): 
newlist = [] 
x = 0 
for alist in listOlists: 
    for name in alist: 
     space = name.find(" ") 
     firstname = (name[0:space]) 
     print(firstname) 

回答

1

我已經重寫,在一個扁平的列表理解使用collections.Counter,計數的名字(使用str.partition)和過濾的名字時超過1次出現:

l = [["John Knight", "John Doe", "Erik Peterson"],["Fred Douglas", "John Stephans", "Mike Dud", "Mike Samuels"]] 

import collections 

x = [k for sl in l for k,v in collections.Counter(x.partition(" ")[0] for x in sl).items() if v>1] 
print(x) 

結果:

['John', 'Mike'] 
0

你可以試試這個:

def func(temp) : 
dic = {} 
for i in temp : 
    for j in i : 
     dic[j.split(" ")[0]] = dic.get(j.split(" ")[0], 0) + 1 
return dic 

現在,我們需要得到其計數大於或等於2。這可以通過一個單一的迭代在字典中完成所有名稱:

temp = [] 
for i in dic : 
    if dic[i] >= 2 : 
     temp.append(dic[i]) 

名單temp將包含所需的結果。

0

我會使用正則表達式,並從每個列表挖出重複名稱:

import re 

names = [["John Knight", "John Doe", "Erik Peterson"],["Fred Douglas", "John Stephans", "Mike Dud", "Mike Samuels"]] 

def extractDups(names): 
     res = [] 
     for eachlist in names: 
      res.extend(re.findall(r'\b(\w+)\b.*\1', ' '.join(eachlist))) 
     return(res) 

例如:

>>>extractDups(names) 
    ['John', 'Mike']