#python #algorithm #list
#python #алгоритм #Список
Вопрос:
У меня есть список списков. Списки состоят из людей из определенных областей, если в списках слишком много людей из определенной области, я хотел бы удалить список из набора списков. Списки имеют длину 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"]]
При тестировании этого конкретного списка тестирование для определения количества людей из Калифорнии составило бы den = 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], поэтому список будет принят.
У финалиста не должно быть списков, в которых слишком много людей из одного места.
Ответ №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']]]
Комментарии:
1. что возвращает последний код? если я печатаю список, он, похоже, возвращает то же самое, что и раньше.
2. Это не изменяет
list
— оно возвращает новый список. Если вы хотите изменитьlist
, напишитеlist = [l for l in list if...
.