Как отсортировать список строк по номерам в строке - PullRequest
0 голосов
/ 04 марта 2020

мой вопрос разделен на две части.

сначала мне нужно отсортировать список следующим образом: a = ['Zone 3', 'Zone', 'Zone 9', 'Zone 10', 'Zone 5'] по номеру Зоны.

Результат должен выглядеть следующим образом: result = ['Zone', 'Zone 3', 'Zone 5', 'Zone 9', 'Zone 10']

Я пробовал это со следующим кодом:

import numpy as np

a = ['Zone 3', 'Zone', 'Zone 9', 'Zone 10', 'Zone 5']
b = np.empty((0,2))
for i in range(0, len(a)):
    if len(a[i]) > 4: 
        a1 = a[i].split()
        a1 = np.array([[a1[0],int(a1[1])]])
    if len(a[i]) == 4:
        a1 = np.array([[a[i], '']])
        print(a2)
    b = np.append(b, a1, axis=0)
b = b[b[:,1].argsort()]
print(b)

с результатом:

[['Zone' '']
 ['Zone' '10']
 ['Zone' '3']
 ['Zone' '5']
 ['Zone' '9']]

Проблема, кажется, в том, что argsort () не распознает 10 как 10, а как 1.

Вторая проблема обнаружена в фоллинговом коде:

seperator = ' '
b = list()
for i in range(len(a)):
    c = seperator.join(b[i])
    print(c)
    b = np.append(b, c)
print(b)

Ошибка Произошло исключение: индекс списка IndexError выходит за пределы диапазона , но индекс должен находиться в диапазоне.

Я надеюсь, что вы можете помочь мне с этими проблемами.

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Я бы использовал встроенную функцию сортировки Python. Вы можете использовать параметр key, чтобы настроить способ сортировки списка.

Например:

a = ['Zone 3', 'Zone', 'Zone 9', 'Zone 10', 'Zone 5']

def zone_key(l):
    try:
        _, v = l.split(' ')
        return int(v)
    except ValueError:
        return 0

print(sorted(a, key=zone_key))

Для вашей второй проблемы: вы пытаетесь получить доступ к элементу ith в списке b (b[i]), но вы также определили b как пустой список (b = list()). На первой итерации вашего l oop i = 0, поэтому он попытается получить доступ к элементу 0 в списке b, который не существует и, следовательно, вызывает ошибку индекса.

0 голосов
/ 04 марта 2020

согласно @hurlenko check natsort :

from natsort import natsorted
natsorted(a, key=lambda y: y.lower())

возвращает список строк:

['Zone', 'Zone 3', 'Zone 5', 'Zone 9', 'Zone 10']
0 голосов
/ 04 марта 2020

Так что все просто

# Will hold the processed values
my_list = list()

# For every tuple in the list
for tup in a:

    # Split on space
    values = tup.split()

    # See if the length is less than two
    if len(values) < 2:

        # Add a 0 if there is nothing
        my_list.append((values[0], 0))
    else:

        # Otherwise save as it is in a tuple
        my_list.append((values[0], int(values[1])))

# Then simply 
my_list.sort(key= lambda x: x[1])

Это будет работать нелепо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...