Сортировка буквенно-цифровых значений словаря в Python - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь отсортировать словарь в python, как показано ниже: В этом сценарии в моем словаре есть 'ESPN' и 'AAA', ключи и значения ниже

'ESPN': [
    'ESPN 90 TO 100_1050',
    'ESPN 60 TO 70_1150',
    'ESPN 80 TO 90_1250',
    'ESPN 90 TO 100_1750',
    'ESPN 90 TO 100_900'
    'ESPN 90 TO 100_1650',
    'ESPN 70 TO 80_1350',
    'ESPN 20 TO 30_1450'
]

'AAA': [
    'AAA 90 TO 100_1050',
    'AAA 60 TO 70_1150',
    'AAA 80 TO 90_1250',
    'AAA 90 TO 100_1750',
    'AAA 90 TO 100_1650',
    'AAA 70 TO 80_1350',
    'AAA 20 TO 30_1450'
]

Я пытаюсьотсортировать этот словарь таким образом, чтобы я хотел получить число после ESPN и AAA по возрастанию, а также число после подчеркивания.

Например, как показано ниже

'ESPN': [
    'ESPN 20 TO 30_1450',
    'ESPN 60 TO 70_1150',
    'ESPN 70 TO 80_1350',
    'ESPN 80 TO 90_1250',
    'ESPN 90 TO 100_900',
    'ESPN 90 TO 100_1650',
    'ESPN 90 TO 100_1750',
]

Я пытаюсьрегулярное выражение и сортировка, но я не могу получить его.Буду очень признателен, если кто-то может помочь.Я также пробовал различные методы сортировки, но в итоге я всегда сортирую ключи, а не значения.Кроме того, в большинстве сценариев он работает не так, как ожидалось, поскольку, когда у меня есть значение от AAA 20 до 30_900, оно не приходит в порядок до AAA 20 до 30_1450, но после него.

TIA

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Вот один из способов использования последовательных str.split вызовов.Отображение в целые числа гарантирует, что 900 будет предшествовать 1000.

def sorter(x):
    _, var1, _, var2 = x.split()
    var2a, var2b = var2.split('_')
    return list(map(int, (var1, var2a, var2b)))

res = sorted(d['ESPN'], key=sorter)

['ESPN 20 TO 30_1450',
 'ESPN 60 TO 70_1150',
 'ESPN 70 TO 80_1350',
 'ESPN 80 TO 90_1250',
 'ESPN 90 TO 100_900',
 'ESPN 90 TO 100_1050',
 'ESPN 90 TO 100_1650',
 'ESPN 90 TO 100_1750']
0 голосов
/ 22 мая 2018

Вы можете использовать re.findall для извлечения всех последовательных последовательностей цифр, преобразования в целые числа и применения лексикографической сортировки.

key = lambda s: tuple(map(int, re.findall('\d+', s)))
result = {k: sorted(v, key=key) for k, v in data.items()}

# Output

In [156]: result
Out[156]: 
{'AAA': ['AAA 20 TO 30_1450',
  'AAA 60 TO 70_1150',
  'AAA 70 TO 80_1350',
  'AAA 80 TO 90_1250',
  'AAA 90 TO 100_1050',
  'AAA 90 TO 100_1650',
  'AAA 90 TO 100_1750'],
 'ESPN': ['ESPN 20 TO 30_1450',
  'ESPN 60 TO 70_1150',
  'ESPN 70 TO 80_1350',
  'ESPN 80 TO 90_1250',
  'ESPN 90 TO 100_900',
  'ESPN 90 TO 100_1050',
  'ESPN 90 TO 100_1650',
  'ESPN 90 TO 100_1750']}
0 голосов
/ 22 мая 2018
d = {
    'ESPN': [
        'ESPN 90 TO 100_1050',
        'ESPN 60 TO 70_1150',
        'ESPN 80 TO 90_1250',
        'ESPN 90 TO 100_1750',
        'ESPN 90 TO 100_1650',
        'ESPN 70 TO 80_1350',
        'ESPN 20 TO 30_1450'
    ],
    'AAA': [
        'AAA 90 TO 100_1050',
        'AAA 60 TO 70_1150',
        'AAA 80 TO 90_1250',
        'AAA 90 TO 100_1750',
        'AAA 90 TO 100_1650',
        'AAA 70 TO 80_1350',
        'AAA 20 TO 30_1450'
    ]
}
[v.sort() for v in d.values()]

Результат:

{'AAA': ['AAA 20 TO 30_1450',
  'AAA 60 TO 70_1150',
  'AAA 70 TO 80_1350',
  'AAA 80 TO 90_1250',
  'AAA 90 TO 100_1050',
  'AAA 90 TO 100_1650',
  'AAA 90 TO 100_1750'],
 'ESPN': ['ESPN 20 TO 30_1450',
  'ESPN 60 TO 70_1150',
  'ESPN 70 TO 80_1350',
  'ESPN 80 TO 90_1250',
  'ESPN 90 TO 100_1050',
  'ESPN 90 TO 100_1650',
  'ESPN 90 TO 100_1750']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...