在列表列表

时间:2017-02-12 16:45:01

标签: python string list iteration

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

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

3 个答案:

答案 0 :(得分: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']

答案 1 :(得分: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将包含所需的结果。

答案 2 :(得分:0)

我使用正则表达式并从每个列表中删除重复的名称:

public partial class MainView : ContentPage
{
    private const string TAG = "MainView";

    public MainView()
    {
        Logger.mt(TAG, "MainView()");
        InitializeComponent();
    }

    public bool setMainContent(ContentView view)
    {
        Logger.mt(TAG, "setMainContent()");
        MainContent.Content = view.Content;
        return true;
    }
}

示例:

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)