【问题标题】:Testing List of Lists to remove unwanted lists based on a constraint测试列表列表以根据约束删除不需要的列表
【发布时间】:2016-10-17 08:00:58
【问题描述】:

我有一个列表列表。列表由来自某些区域的人组成,如果列表中有来自某个区域的太多人,我想从列表集中删除该列表。列表的长度为 9

list=[[["Aarat","California"],
["Aaron","California"],
["Abba","California"],
["Abaddon","California"],
["Abner","Nevada"],
["Abram","Nevada"],
["Abraham","Nevada"],
["Absalom","Nevada"],
["Adullam","Utah"]],
......,
[["Abital","California"],
["Abitub","California"],
["Absalom","Nevada"],
["Accad","Nevada"],
["Agar","Utah"],
["Agee","Utah"],
["Aijeleth-Shahar","New Mexico"],
["Ain","New Mexico"],
["Amram","Washington"]]]
Cities=["California","Nevada","Utah","New Mexico","Idaho","Washington"]
denk=[] 
for city in Cities:
    den=[]
    for i in list:
        a=i[0]
        b=i[1]
        c=i[2]
        d=i[3]
        e=i[4]
        f=i[5]
        g=i[6]
        h=i[7]
        k=i[8]
        if a==city:
            ab=1
        if b==city:
            ac=1
        if c==city:
            ad=1
        if d==city:
            ae=1
        if e==city:
            af=1
        if f==city:
            ag=1
        if g==city:
            ah=1
        if h==city:
            ai=1
        if k==city:
            aj=1
        if (ab+ac+ad+ae+af+ag+ah+ai+aj)>3:
            den.append(1)
        if (ab+ac+ad+ae+af+ag+ah+ai+aj)<4:
            den.append(0)
    denk.append(sum(den))

finalList=[]
for i, j in enumerate(denk):
    if j == 0:
        finalList.append(list[i])

我尝试计算来自城市的人数,如果人数大于 3,我尝试添加 1,如果不是 0。我这样做只是为了总结列表的次数超过配额。

Cities=["California","Nevada","Utah","New Mexico","Idaho","Washington"]

[["Aarat","California"],
["Aaron","California"],
["Abba","California"],
["Abaddon","California"],
["Abner","Nevada"],
["Abram","Nevada"],
["Abraham","Nevada"],
["Absalom","Nevada"],
["Adullam","Utah"]]

在测试这个特定列表时,测试看看有多少人来自加利福尼亚,因为有超过 3 人来自加利福尼亚,所以 den=1。下一个城市,内华达州,也会使 den=1,依此类推...... den=[1,1,0,0,0,0] 登克=[2] 所以这个列表被扔掉了

[["Abital","California"],
["Abitub","California"],
["Absalom","Nevada"],
["Accad","Nevada"],
["Agar","Utah"],
["Agee","Utah"],
["Aijeleth-Shahar","New Mexico"],
["Ain","New Mexico"],
["Amram","Washington"]]

在此处执行相同操作会为 Cities 中的每个城市生成 den=0,den=[0,0,0,0,0,0],denk=[0],因此该列表将被接受。

finalList 不应包含任何来自一个地方的人员过多的列表。

【问题讨论】:

    标签: python algorithm list


    【解决方案1】:

    假设您从以下内容开始:

    list=[[["Aarat","California"],
        ["Aaron","California"],
        ["Abba","California"],
        ["Abaddon","California"],
        ["Abner","Nevada"],
        ["Abram","Nevada"],
        ["Abraham","Nevada"],
        ["Absalom","Nevada"],
        ["Adullam","Utah"]],[["Abital","California"],
        ["Abitub","California"],
        ["Absalom","Nevada"],
        ["Accad","Nevada"],
        ["Agar","Utah"],
        ["Agee","Utah"],
        ["Aijeleth-Shahar","New Mexico"],
        ["Ain","New Mexico"],
        ["Amram","Washington"]]]
    

    要查找每个二级列表中的分布,您可以使用列表理解和collections.Counter

    import collections
    
    >>> [collections.Counter(e[1] for e in l) for l in list]
    [Counter({'California': 4, 'Nevada': 4, 'Utah': 1}),
     Counter({'California': 2,
              'Nevada': 2,
              'New Mexico': 2,
              'Utah': 2,
              'Washington': 1})]
    

    要在每个二级列表中查找最常见的计数,您可以使用

    >>> [collections.Counter(e[1] for e in l).most_common(1)[0][1] for l in list]
    [4, 2]
    

    因此,要仅保留最常见计数最多为 3 的二级列表,您可以使用

    >>> [l for l in list if collections.Counter(e[1] for e in l).most_common(1)[0][1] <= 3]
    [[['Abital', 'California'],
      ['Abitub', 'California'],
      ['Absalom', 'Nevada'],
      ['Accad', 'Nevada'],
      ['Agar', 'Utah'],
      ['Agee', 'Utah'],
      ['Aijeleth-Shahar', 'New Mexico'],
      ['Ain', 'New Mexico'],
      ['Amram', 'Washington']]]
    

    【讨论】:

    • 最后一个代码返回什么?如果我打印列表,它似乎返回和以前一样。
    • 这不会修改list - 它会返回一个新列表。如果要修改list,写list = [l for l in list if...
    猜你喜欢
    • 2023-03-15
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多