2014-01-31 2 views
1

У меня есть файл csv, полный налоговых данных. Я прочитал данные во вложенные списки, таким образом, что он отформатирован так:Эффективный поиск вложенных списков

['Alabama', 'Single rate', '0.02', '0.04', '5'] 
['Alabama', 'Single bracket', '500', '3000'] 
['Alabama', 'Couple rate', '0.02', '0.04', '0.05'] 
['Alabama', 'Couple bracket', '1000', '6000'] 

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

search_state = 'Alabama' 
search_status = 'Single' 
rates = [] 
brackets = [] 
for sublist in cleaned_data: 
    if search_state in sublist[0] and search_status in sublist[1]: 
    if 'rate' in sublist[1]: 
     rates = [eval(x) for x in sublist[2:]] 
    if 'bracket' in sublist[1]: 
     brackets = [eval(x) for x in sublist[2:]] 
+0

Это не ясно из вашего поста, что точный формат 'cleaned_data' находится в . –

+0

Вы должны построить (вложенный) словарь из этих данных. –

+2

Если вы хотите иметь возможность делать это много раз с большим количеством данных, это именно то, для чего существуют базы данных. Модуль stdlib 'sqlite3' очень хорош. –

ответ

4

Вы бы лучше служили с вложенным словарем:

rates={'Alabama':{'Single rate':['0.02', '0.04', '5'], 
        'Single bracket': ['500', '3000'], 
        'Couple rate': ['0.02', '0.04', '0.05'], 
        'Couple bracket': ['1000', '6000']}} 

print(rates['Alabama']['Couple rate']) 
# ['0.02', '0.04', '0.05'] 

Предполагая, что файл CDV выглядит следующим образом:

'Alabama', 'Single rate', '0.02', '0.04', '5' 
'Alabama', 'Single bracket', '500', '3000' 
'Alabama', 'Couple rate', '0.02', '0.04', '0.05' 
'Alabama', 'Couple bracket', '1000', '6000' 

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

import csv 

rates={} 
with open(ur_file) as f: 
    for line in csv.reader(f, skipinitialspace=True, quotechar="'"): 
     rates.setdefault(line[0],{})[line[1]]=[float(e) for e in line[2:]] 

print(rates)  

Печать:

{'Alabama': {'Couple rate': [0.02, 0.04, 0.05], 
'Single rate': [0.02, 0.04, 5.0], 
'Single bracket': [500.0, 3000.0], 
'Couple bracket': [1000.0, 6000.0]}} 

Редактировать

Как было отмечено в комментариях, три уровня вложенным ДИКТ, вероятно, лучше, как эта структура данных:

rates={'Alabama':{'Single': {'rate':['0.02', '0.04', '5'], 
          'bracket': ['500', '3000']}, 
        'Couple': {'rate': ['0.02', '0.04', '0.05'], 
          'bracket': ['1000', '6000']}}} 

В то время как тривиально использовать defaultdict или setdefault, чтобы иметь дело с двухуровневым типом с отсутствующими ключами, требуется немного больше, чтобы элегантно справляться с несколькими уровнями.

Мой любимый использовать Perl как autovivification подкласс Словаре следующим образом:

class AutoVivify(dict): 
    """Implementation of perl's autovivification feature.""" 
    def __missing__(self, item): 
     value = self[item] = type(self)() 
     return value 

rates=AutoVivify() 
with open(ur_file) as f: 
    for line in csv.reader(f, skipinitialspace=True, quotechar="'"): 
     state=line[0] 
     k1,k2=line[1].split() 
     rates[state][k1][k2]=[float(e) for e in line[2:]] 

print(rates) 

Печать:

{'Alabama': {'Single': { 
         'rate': [0.02, 0.04, 5.0], 
         'bracket': [500.0, 3000.0]}, 
      'Couple': { 
         'rate': [0.02, 0.04, 0.05], 
         'bracket': [1000.0, 6000.0]}}} 
+1

+1, но может быть даже лучше иметь три уровня dicts, так как «поисковый запрос» кажется просто «одиночным», а ожидаемый результат - значением скорости и скобки, т. Е.'{'Alabama': {'Couple': {'rate': [0.02, 0.04, 0.05], ...' –

+0

Конечно, вы все правы - вложенный словарь имеет гораздо больший смысл. – user1978374

+0

@tobias_k, я бы поднял ваши ответы, если бы мог - спасибо! – user1978374

Смежные вопросы