сортировка пар значений с одной парой в формате доллара в питоне - PullRequest
0 голосов
/ 01 мая 2018

поэтому у меня есть такой список.

items = [('30-Apr-2018', '$0.14'), ('30-Apr-2018', '$1,534.77'), ('29-Apr-2018', '-$7.34')]

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

items = sorted(items, key=lambda x: x[1])
items = sorted(items,key=itemgetter(1))

Но они продолжают выходить из строя. Похоже, какая-то сортировка сделана? Но не правильно по какой-то причине, что, как я подозреваю, связано с форматом второго элемента в паре списков. Любые предложения о том, как это отсортировать? Единственный вариант, который я вижу, - преобразовать значение доллара в десятичное, затем попытаться снова выполнить сортировку и, возможно, добавить знак доллара обратно, но, возможно, у кого-то еще будет лучшее решение.

Полный список здесь. before sort = [('30-апрель-2018 ',' $ 0,14 '), ('30 -апрель-2018', '$ 101,65'), ('30 -апрель-2018 ',' $ 1534,77 '), ('29 - Апрель-2018, '- $ 37,78'), ('29-апрель-2018 ',' $ 6,31 '), ('29-апрель-2018', '- $ 4,76'), ('29-апрель-2018 ',' - 39,55 долл. США), («28 апреля 2018 г.», - 664,78 долл. США), «28 апреля 2018 г.», - 142,25 долл. США), «28 апреля 2018 г.», - 9,12 долл. США), ('27-апрель-2018 ',' - $ 7,34 '), ('27-апрель-2018', '- $ 7,34'), ('26-апрель-2018 ',' - $ 7,34 '), ('26-апрель -2018 ',' - $ 13.23 '), ('25-апрель-2018', '- $ 7.34'), ('25-апрель-2018 ',' - $ 2.09 '), ('24-апрель-2018', ' - 27,27 долл. США), («24 апреля 2018 г.», - 9,96 долл. США), «24 апреля 2018 г.», - 110,00 долл. США), «23 апреля 2018 г.», - 7,34 долл. США), ('22-апрель-2018 ',' - 87,02 $ '), ('22-апрель-2018', '- 5,41 $'), ('22-апрель-2018 ',' - 21,11 $), ('21-апрель -2018 ',' - $ 12,69 '), ('21-апрель-2018', '- $ 6,75'), ('21-апрель-2018 ',' - $ 500,00 '), ('21-апрель-2018', ' - 15,67 долл. США), («20 апреля 2018 г.», - 41,74 долл. США), («20 апреля 2018 г.», - 20,47 долл. США), («20 апреля 2018 г.», 31,60 долл. США), ( '19-апрель-2018 ',' - $ 7.34 '), ('19-апрель-2018', '- $ 2.09'), ('19-апрель-2018 ',' - $ 5.24 '), ('19-апрель- 2018, '- $ 22,70'), ('18-апрель-2018 ',' - $ 7,34 '), ('17-апрель-2018', '- 7,34 долл. США, («17 апреля 2018 г.», - 4,99 долл. США), «17 апреля 2018 г.», - 7,34 долл. США), «16 апреля 2018 г.», - 7,33 долл. США), ( «16 апреля 2018 года», - 59,00 долларов США, («15 апреля 2018 года», - 42,75 доллара США), («14 апреля 2018 года», - 9,43 доллара США), «13 апреля - 2018 ',' 1545,79 $ '), ('12-апрель-2018', '- $ 7,34'), ('12-апрель-2018 ',' - 11,63 $ '), (' 12-апрель-2018 '', '- 14,44 $ '), ('11-апрель-2018', '- 81,31 долл. США), ('10-апрель-2018', '- $ 79,74'), ('10-апрель-2018 ',' - $ 7,34 '), (' 10 апреля 2018 года, '- 11,11 доллара США', ('09-апреля-2018 ',' - $ 7,34 '), ('07-апреля-2018', '- $ 72,42'), ('06-апреля-2018 года) ',' - $ 3,01 '), ('06-апрель-2018', '- $ 7,34'), ('05-апрель-2018 ',' - $ 7,34 '), ('05-апрель-2018', '- 9,20 $ '), ('04-апрель-2018', '- $ 7.34'), ('03-апрель-2018 ',' - $ 7.34 '), ('03-апрель-2018', '- 460,00 $'), (' 03 апреля 2016 г., '- $ 7,34'), ('02-апрель-2018 ',' - $ 7,34 '), ('02-апрель-2018', '$ 289,04'), ('01-апрель-2018 ') , '- $ 6,30'), ('01-апрель-2018 ',' - $ 7.50 '), ('01-апрель-2018', '- $ 13,28')]

после сортировки = [('30-апрель-2018 ',' $ 0,14 '), ('30 -апрель-2018', '$ 1534,77'), ('13 -апрель-2018 ',' $ 1545,79 '), ( «30 апреля 2018 года», «101,65 доллара США», («02 апреля апреля 2018 года, 289,04 доллара США»), (20 апреля 2018 года, 31,60 доллара США), «29 апреля 2018 года», «6,31 долл. США), (« 10 апреля 2018 г. », - 11,11 долл. США),« 12 апреля 2018 г. », - 11,63 долл. США),« 24 апреля 2018 г. », - 110,00 долл. США), ('21-апрель-2018 ',' - 12,69 $ '), ('26-апрель-2018', '- $ 13,23'), ('01-апрель-2018 ',' - 13,28 $), ('12-апрель -2018, '- $ 14,44'), ('28-апрель-2018 ',' - $ 142,25 '), ('21-апрель-2018', '- $ 15,67'), ('25-апрель-2018 ',' - 2,09 долл. США), («19 апреля 2018 г.», - 2,09 долл. США), «20 апреля 2018 г.», - 20,47 долл. США), «22 апреля 2018 г.», - 21,11 долл. США), («19 апреля 2018 года», - 22,70 доллара США), («24 апреля 2018 года», - 27,27 доллара США), («06 апреля 2018 года», - 3,01 доллара США), «29 апреля -2018 ',' - $ 37,78 '), ('29-апрель-2018', '- $ 39,55'), ('29-апрель-2018 ',' - $ 4,76 '), ('17-апрель-2018', ' - 4,99 долл. США, («20 апреля 2018 г.», - 41,74 долл. США), («15 апреля 2018 г.», - 42,75 долл. США), («03 апреля 2018 г.», - 460,00 долл. США), ('19-апрель-2018 ',' - $ 5,24 '), ('22-апрель-2018', '- $ 5,41'), ('21-апрель-2018 ',' - $ 500,00 '), ('16-апрель -2018 ',' - $ 59,00 '), ('01-апрель-2018', '- $ 6,30'), ('21 -Apr-2018 ',' - $ 6,75 '), ('28-April-2018', '- $ 664,78'), ('16-April-2018 ',' - $ 7,33 '), ('27-April-2018' , '- $ 7,34'), ('27-апрель-2018 ',' - $ 7,34 '), ('26-апрель-2018', '- $ 7,34'), ('25-апрель-2018 ',' - $ 7,34 ' ), ('23-апрель-2018 ',' - $ 7,34 '), ('19-апрель-2018', '- $ 7,34'), ('18-апрель-2018 ',' - $ 7,34 '), ('17 -Apr-2018 ',' - $ 7,34 '), ('17-April-2018', '- $ 7,34'), ('12-April-2018 ',' - $ 7,34 '), ('10-April-2018' , '- $ 7,34'), ('09-апрель-2018 ',' - $ 7.34 '), ('06-апрель-2018', '- $ 7.34'), ('05-апрель-2018 ',' - $ 7.34 ' ), ('04-апрель-2018 ',' - $ 7,34 '), ('03-апрель-2018', '- $ 7,34'), ('03-апрель-2018 ',' - $ 7,34 '), ('02 -Apr-2018 ',' - $ 7,34 '), ('01-апрель-2018', '- $ 7,50'), ('07-апрель-2018 ',' - $ 72,42 '), ('10-апрель-2018' , '- $ 79,74'), ('11-апрель-2018 ',' - $ 81,31 '), ('22-апрель-2018', '- $ 87,02'), ('28-апрель-2018 ',' - $ 9,12 ' ), ('05-апрель-2018 ',' - 9,20 долл. США), ('14-апрель-2018 ',' - $ 9,43 '), ('24 апреля-2018', '- 9,96 долл. США)]

Ответы [ 2 ]

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

Использование списков для форматирования / преобразования:

items = [(date, float("".join(c for c in price if c!='$' and c!=','))) for date, price in items]

тогда просто сортируй как задумано ...

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

Чтобы отсортировать цену, сначала необходимо преобразовать их в числовой формат (число с плавающей точкой или целое число). Итак, чтобы преобразовать вашу строку, вам нужно выполнить следующий шаг:

  1. Удалить все ","
  2. Проверьте, является ли число отрицательным (начните с "-")
  3. Преобразовать в цифры float
  4. Преобразовать в int

Вы можете использовать следующий код:

def convert(string):
    string = string.replace(",","")
    num_val = 0.0
    if string[0]=="-":
        num_val = -float(string[2:])
    else:
        num_val = float(string[1:])
    # If you want integer value in cents
    # return int(round(num_val*100.0))
    return num_value

items = [(d, convert(p)) for (d,p) in items]

Полученный результат можно объяснить тем, что при сортировке строки вы делаете это символ за символом и "-" > "$", поэтому все отрицательные числа находятся в конце и сортируются в лексикографическом порядке.

...