Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 高效搜索嵌套列表_Python_Python 3.x - Fatal编程技术网

Python 高效搜索嵌套列表

Python 高效搜索嵌套列表,python,python-3.x,Python,Python 3.x,我有一个充满税务数据的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'] 'Alabama', 'Single rat

我有一个充满税务数据的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']
'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:]]

最好使用嵌套字典:

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']
'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'
可以通过以下方式构造嵌套dict:

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]}}
{'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]}}}

编辑

正如评论中指出的,三层嵌套dict可能更好,如以下数据结构:

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来处理缺少键的两层dict很简单,但要优雅地处理多个级别需要更多的时间

我最喜欢的是使用类似Perl的子类a dict,如下所示:

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': {'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]}}
{'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]}}}

最好使用嵌套字典:

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']
'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'
可以通过以下方式构造嵌套dict:

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]}}
{'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]}}}

编辑

正如评论中指出的,三层嵌套dict可能更好,如以下数据结构:

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来处理缺少键的两层dict很简单,但要优雅地处理多个级别需要更多的时间

我最喜欢的是使用类似Perl的子类a dict,如下所示:

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': {'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]}}
{'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]}}}


从您的帖子中不清楚
cleaned_data
的确切格式是什么。如果您想用大量数据多次这样做,这正是数据库存在的目的。stdlib
sqlite3
模块非常好。基本上,您永远不会想要使用
eval
。如果您有一个像
“'foo'”
这样的字符串,并且想要得到一个像
'foo'
这样的字符串,请尝试
s[1:-1]
,或者,如果您真的坚持,
ast.literal\u eval
子列表是一个无助于显示数据格式的名称。您可能会通过尝试给出清晰的名称来编写清晰的代码,比如状态的
,清除数据中的状态:
。(我不知道实际的格式,你必须知道这个名字的真正含义。)或者你的原始文件是什么样子的?从你的帖子中不清楚什么是确切的格式
cleaned_data
。如果你想用大量的数据多次这样做,这正是数据库存在的目的。stdlib
sqlite3
模块非常好。基本上,您永远不会想要使用
eval
。如果您有一个像
“'foo'”
这样的字符串,并且想要得到一个像
'foo'
这样的字符串,请尝试
s[1:-1]
,或者,如果您真的坚持,
ast.literal\u eval
子列表是一个无助于显示数据格式的名称。您可能会通过尝试给出清晰的名称来编写清晰的代码,比如状态的
,清除数据中的状态:
。(我不知道实际的格式,你必须知道这个名字的真正含义。)或者你的原始文件是什么样子的?+1,但最好有三个级别的dict,因为“搜索查询”似乎只是“单一”,而预期的结果是rate和方括号值,即
{Alabama':{Couple':{rate':[0.02, 0.04, 0.05],…
当然你们都是对的-嵌套字典更有意义。@tobias_k,如果可以的话,我也会投票支持你们的答案-谢谢!还要感谢@mike graham提出的清理代码的建议。@tobias_k:这样做稍微考虑一下,但我同意——这是一种更好的方法。谢谢!+1,但这可能更好o有三个级别的dicts,因为“搜索查询”似乎只是“单个”,预期结果是rate和括号值,即
{'Alabama':{'Couple':{'rate':[0.02,0.04,0.05],…
当然你们都是对的-嵌套字典更有意义。@tobias_k,如果可以的话,我也会投票支持你们的答案-谢谢!同时,也感谢@mike graham提出的清理代码的建议。@tobias_k:这样做稍微考虑一下,但我同意——一个更好的方法。谢谢!