2016-10-17 30 views
1

我有一个列表的列表。这些名单由某些地区的人组成,如果名单中有太多人来自某个地区,我想从列表中删除名单。该列表是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"]] 

在测试这个特殊列表中的测试,看看有多少人来自加利福尼亚州将使书房= 1,因为有来自加利福尼亚州超过3人。下一个城市,内华达州,也将使den = 1,依此类推...... den = [1,1,0,0,0,0] denk = [2] 所以这个列表被抛出

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

在这里做同样的产生城市中的每个城市den = 0,den = [0,0,0,0,0,0],denk = [0]所以列表将被接受。

finalList不应该有任何列表中有太多人从一个地方。

回答

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

最后一个代码返回的内容是什么?如果我打印清单,它看起来像以前一样返回。 –

+1

这不会修改'list' - 它会返回一个新的列表。如果你想修改'list',写'list = [l for l in list if ...'。 –