簡體   English   中英

在列表列表中操作字符串

[英]Manipulating a string, in a list of lists

我正在編寫一個將列表作為參數的函數。 此參數是一個字符串列表列表,每個字符串包含由空格分隔的名字和姓氏。 如果名字重復,我應該檢查每個列表,如果是,則創建一個包含重復名稱的新列表。 僅當該詞在其子列表中重復時才算作重復。 例如

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

我會在扁平列表理解中使用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將包含所需的結果。

我會使用正則表達式並從每個列表中取出重復的名稱:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM