2017-02-12 64 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']