2016-02-05 11 views
0

У меня есть список вещей, которые я добавляю в словарь ниже:Добавить ключ/значение в словарь используя условие

COLS = ['CUST', 'MODEL', 'SN', 'DATE', 'CHARGE', 'QTY', 'TOTAL'] 
with open('UserfeeInvoicing.csv', 'r') as infile: 
    ranpak_dict = { 
     row[2]: dict(zip(COLS, row)) for row in csv.reader(infile) 
    } 

Есть ли вообще добавлять только записи, которые имеют CHARGE =/= 0 или CHARGE > 0

+0

Вы можете уточнить состояние? 'CHARGE> 0' уже подразумевает' CHARGE! = 0' - вы имеете в виду 'CHARGE> = 0'? – Lisa

+1

@ Lisa: Я думаю, что это всего лишь два примера. –

ответ

3

Вместо использования csv.reader() используйте csv.DictReader() object. Этот объект упрощает создание ваших словарей и фильтрацию строк; ваш код, переработан использовать DictReader(), выглядит следующим образом:

COLS = ['CUST', 'MODEL', 'SN', 'DATE', 'CHARGE', 'QTY', 'TOTAL'] 
with open('UserfeeInvoicing.csv', 'r') as infile: 
    reader = csv.DictReader(infile, fieldnames=COLS) 
    ranpak_dict = {row['SN']: row for row in reader} 

csv.DictReader() объект делает точно, что делает ваш dict(zip(COLS, row)) вызов; постройте словарь из каждой строки, задав последовательность имен полей.

Фильтрация в списке, определение или установление понимания работает так же, как добавление дополнительных циклов; просто добавьте if <condition> к петле:

ranpak_dict = {row['SN']: row for row in reader if int(row['CHARGE']) > 0} 

Обратите внимание на int() вызов; Я предполагаю, что столбец CHARGEвсегда содержит цифры.

Если ваши текстовые поля указаны, вы также можете установить quoting=csv.QUOTE_NONNUMERIC, после чего все столбцы без кавычек автоматически преобразуются в float. Это было бы сократить код на:

reader = csv.DictReader(infile, fieldnames=COLS, quoting=csv.QUOTE_NONNUMERIC) 
ranpak_dict = {row['SN']: row for row in reader if row['CHARGE'] > 0} 
+0

Мне очень нравится это решение, и я пытаюсь его использовать. Однако в создании словаря я получаю синтаксические ошибки. Ожидается Else после утверждения If. – AlliDeacon

+0

@AlliDeacon: нет, мне не хватало выражения ценности в понимании dict; теперь исправлено. –

1

Вы можете сделать следующее:

ranpak_dict = {} 
COLS = ['CUST', 'MODEL', 'SN', 'DATE', 'CHARGE', 'QTY', 'TOTAL'] 

with open('UserfeeInvoicing.csv', 'r') as infile:  

    reader = csv.reader(infile) 
    for row in reader: 

     if float(row[COLS.index('CHARGE')]) >= 0: 
      ranpak_dict[row[2]] = dict(zip(COLS, row)) 
Смежные вопросы