Проблема с использованием Python для нарезки списков для отображения данных - PullRequest
1 голос
/ 09 марта 2011

Одна из моих новых обязанностей требует, чтобы я переводил или отображал данные из одного формата в другой, обычно из xcel, csv или ms mdb, в xml, sql или согласно спецификации, которую мне дают, поэтому обычно каждое отображение отличается. Я начал изучать Python, чтобы сделать это как предшественник Lisp. Я учусь больше каждый день и на самом деле получаю удовольствие от своей работы. Я сейчас пытаюсь обернуть свой мозг вокруг Генераторов и Итераторов, но пока не уверен, когда и как они нужны, но здесь я застрял.

Какой правильный питонический способ использовать значение из среза для проверки определенных условий и, если оно выполнено, назначить соответствующее значение. Когда я пытаюсь получить if elif с <=, я не получаю желаемого результата. Приведенный ниже пример является лишь одним из многих утверждений elif, которые я создал для проверки условий. </p>

#This works
hsa_id = ''
if "1" in csvitem[63:64]:
    hsa_id = '<4 hours'
elif "2" in csvitem[63:64]:
    hsa_id = '<4 hours'
elif "4" in csvitem[63:64]:
    hsa_id = '4-8 hours'
elif "5" in csvitem[63:64]:
    hsa_id = '4-8 hours'
elif "6" in csvitem[63:64]:
    hsa_id = '4-8 hours'
elif "8" in csvitem[63:64]:
    hsa_id = '8-16 hours'
elif "9" in csvitem[63:64]:
    hsa_id = '8-16 hours'
elif "16" in csvitem[63:64]:
    hsa_id = '16-24 hours'
elif "17" in csvitem[63:64]:
    hsa_id = '16-24 hours'
elif "24" in csvitem[63:64]:
    hsa_id = '16-24 hours'
elif "25" in csvitem[63:64]:
    hsa_id = '>24 hours'
else:
    hsa_id = ''
HOURSSINCEAWAKENING.append(hsa_id)

#This does not work. I tried removing the quotes. With and without the quotes I get all identical values.
hsa_id = ''
    if csvitem[63:64] <= "3":
        hsa_id = '<4 hours'
    elif csvitem[63:64] <= "7":
        hsa_id = '4-8 hours'
    elif csvitem[63:64] <= "15":
        hsa_id = '8-16 hours'
    elif csvitem[63:64] <= "23":
        hsa_id = '16-24 hours'
    elif csvitem[63:64] > "23":
        hsa_id = '>24 hours'
    else:
        hsa_id = ''
    HOURSSINCEAWAKENING.append(hsa_id)  

#Output from what does not work truncated for brevity as there are thousands of records.
['<4 hours', '<4 hours', '<4 hours', '<4 hours',...

Ответы [ 5 ]

1 голос
/ 09 марта 2011

Вы сравниваете строки и, возможно, хотите сравнить числа.Используйте int ()

if int(csvitem[63]) <= 3:

Вероятно, вы также хотите реорганизовать свой код, чтобы исключить так много if.В качестве примера вы можете сделать что-то вроде:

data = [(3, '<4'), (7, '4-8'), (15, '8-16'), (23, '16-24'), (10000, '>24']

dattime = int(cvsitem[63])
hsa_id = ''
for mytime, text in data:
    if dattime <= mytime:
        hsa_id = '%s hours' % text
        break

И то же самое можно сделать для первой цепочки if в вашем коде.В этом случае, однако, было бы лучше создать dict с вашими параметрами, а затем использовать его как:

choices_dict = {'1':'<4 hours', ...}
hsa_id = choices_dict.get(cvsitem[63], '')
1 голос
/ 09 марта 2011

Когда вы говорите python сравнивать вещи, он очень редко будет жаловаться. Если вы скажете ему сравнить строку с бананом, он, вероятно, скажет вам, что одна строка больше другой, но для вас ответ не будет иметь смысла.

Вы сравниваете строки с числами. Вы должны сравнить числа с числами:

>>> "3" < "20"
False
>>> "3" < "20"
False
>>> int("3") < int("20")
True

Превратите свои строки в числа перед сравнением, и все будет в порядке.

1 голос
/ 09 марта 2011

Вы сравниваете строки.Посмотрите на эти сравнения:

>>> "23"<"3"
True
>>> "04"<"3"
True

Я думаю, вы хотите сравнить целочисленные значения.Попробуйте это: ... если int (csvitem [63:64]) <= 3: ... и т. Д. </p>

0 голосов
/ 09 марта 2011

Что такое csvitem в вашем примере?Исходя из вашего примера (и названия), я предполагаю, что это какая-то последовательность предметов.Например, ["a", "b", "c" .... "25", ...].

Однако в этом случае взятие фрагмента и использование in немного обходятся- он извлекает список из одного элемента (например, ["25"] и проверяет членство. Вместо этого вы действительно должны сделать что-то вроде `if '25' == csvitem [63].

Другая ваша проблема -потому что тип данных элемента - строка, которая будет по-разному сравниваться с числами. Чтобы обработать элемент как число, сначала преобразуйте его в единицу с помощью функции int. Например:

if int(csvitem[63]) <= 3:
    hsa_id = '<4 hours'

Также, здесь, возможно, стоит отметить полезную особенность python: связывание операторов. В отличие от многих языков, вы можете проверить диапазон значений, используя синтаксис "lowerbound < value < upper_bound" (используя соответствующее сравнение). Вы можете написать свой примеркак:

hours = int(csvitem[63])
if hours < 4:
    hsa_id = "<4 hours"
elif 4 <= hours < 8:
    hsa_id = "4-8 hours"
elif 8 <= hours < 16:
    hsa_id = "8-16 hours"
elif 16 <= hours <= 24:
    hsa_id = "16-24 hours"
else:
    hsa_id = ">24 hours"
0 голосов
/ 09 марта 2011

Проблемы:

  • Ваш фрагмент содержит один символ, но вы сравниваете 2.
  • Вы выполняете реляционное сравнение строк вместо целочисленных сравнений.
  • В Python есть модуль для работы с данными CSV, поэтому вам вообще не нужно срезать.
  • Вы должны использовать dict для хранения значений, которые вы хотите сравнить, вместо того, чтобы иметь большой if / elifструктура.
...