Я пытаюсь получить длину значений массива состояний в отдельный массив, а затем отсортировать их в порядке убывания, но у меня возникают проблемы с получением всех значений длины строки в массив, вместо того, чтобы иметь одно значение после итерация.

states = ["Abia", "Adamawa", "Anambra", "Akwa Ibom", "Bauchi", "Bayelsa", "Benue", "Borno", "Cross River", "Delta", "Ebonyi", "Enugu", "Edo", "Ekiti", "Gombe", "Imo", "Jigawa", "Kaduna", "Kano", "Katsina", "Kebbi", "Kogi", "Kwara", "Lagos", "Nasarawa", "Niger", "Ogun", "Ondo", "Osun", "Oyo", "Plateau", "Rivers", "Sokoto", "Taraba", "Yobe", "Zamfara"]

for i in states:
    a = [len(i)]
    print(a)
0
Godwin 20 Авг 2018 в 17:05

4 ответа

Лучший ответ

Поскольку вы хотите, чтобы длины были отсортированы в порядке убывания, используйте sorted с reverse=True и составьте список

states = ["Abia", "Adamawa", "Anambra", "Akwa Ibom", "Bauchi", "Bayelsa", "Benue", "Borno", "Cross River", "Delta", "Ebonyi", "Enugu", "Edo", "Ekiti", "Gombe", "Imo", "Jigawa", "Kaduna", "Kano", "Katsina", "Kebbi", "Kogi", "Kwara", "Lagos", "Nasarawa", "Niger", "Ogun", "Ondo", "Osun", "Oyo", "Plateau", "Rivers", "Sokoto", "Taraba", "Yobe", "Zamfara"]
a = sorted([len(i) for i in states], reverse=True)
print (a)

Вывод

[11, 9, 8, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3]

Чтобы получить индексы отсортированного списка без обращения к массивам NumPy, есть много способов: см. здесь. Я лично предпочитаю напрямую использовать NumPy argsort. Как следует из названия, он возвращает массив индексов, соответствующих отсортированному массиву / списку в порядке возрастания. Чтобы получить индексы в порядке убывания, вы можете просто перевернуть массив, возвращенный argsort, используя [::-1]. Следующее решение вашей проблемы:

import numpy as np
states = ["Abia", "Adamawa", "Anambra", "Akwa Ibom", "Bauchi", "Bayelsa", "Benue", "Borno", "Cross River", "Delta", "Ebonyi", "Enugu", "Edo", "Ekiti", "Gombe", "Imo", "Jigawa", "Kaduna", "Kano", "Katsina", "Kebbi", "Kogi", "Kwara", "Lagos", "Nasarawa", "Niger", "Ogun", "Ondo", "Osun", "Oyo", "Plateau", "Rivers", "Sokoto", "Taraba", "Yobe", "Zamfara"]
a = [len(i) for i in states]
indices_sorted = np.argsort(a)[::-1] # [::-1] gives you indices for decreasing order

Вывод

array([ 8,  3, 24, 35, 19,  1,  2, 30,  5,  4, 10, 16, 17, 33, 32, 31, 22,
   13,  6,  7,  9, 11, 14, 25, 23, 20, 21, 26, 27, 34, 28, 18,  0, 12,
   15, 29])

Теперь, как вы можете видеть, первый индекс в вышеприведенном выводе - это 8, что означает 9-й элемент states, то есть Cross River. Точно так же вы можете получить доступ и проверить другие элементы.

3
Sheldore 21 Авг 2018 в 09:37

Через генератор:

lens = [len(a) for a in states]
0
dorintufar 20 Авг 2018 в 14:07

Вы также можете сделать это, используя map без используя цикл for:

a = list(map(len,states))
1
Vasilis G. 20 Авг 2018 в 14:09

Вы можете использовать понимание списка:

lengths = [len(state) for state in states]

Если вам нужно использовать цикл for, создайте список и добавьте к нему:

lengths = []
for i in states:
    lengths.append(len(i))
2
jh314 20 Авг 2018 в 14:06
51932518