操作字符串,列表中的列表

2024-10-03 21:28:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个函数,它接受一个列表作为参数。此参数是一个字符串列表,每个字符串包含用空格分隔的名字和姓氏。如果名字是重复的,我应该检查每个列表,如果是,创建一个包含重复名字的新列表。这个词只有在其子列表中重复时才算作重复。例如

 >>>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)

Tags: 函数字符串namein列表for参数space
3条回答

我重写了在扁平列表理解中使用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']

你可以试试这个:

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将包含所需的结果。你知道吗

我会使用regex并从每个列表中提取重复的名称:

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'] 

相关问题 更多 >