Python 高效搜索嵌套列表
我有一个充满税务数据的csv文件。我将数据读入嵌套列表,因此其格式如下: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
['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
的确切格式是什么。如果您想用大量数据多次这样做,这正是数据库存在的目的。stdlibsqlite3
模块非常好。基本上,您永远不会想要使用eval
。如果您有一个像“'foo'”
这样的字符串,并且想要得到一个像'foo'
这样的字符串,请尝试s[1:-1]
,或者,如果您真的坚持,ast.literal\u eval
子列表是一个无助于显示数据格式的名称。您可能会通过尝试给出清晰的名称来编写清晰的代码,比如状态的,清除数据中的状态:
。(我不知道实际的格式,你必须知道这个名字的真正含义。)或者你的原始文件是什么样子的?从你的帖子中不清楚什么是确切的格式cleaned_data
。如果你想用大量的数据多次这样做,这正是数据库存在的目的。stdlibsqlite3
模块非常好。基本上,您永远不会想要使用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:这样做稍微考虑一下,但我同意——一个更好的方法。谢谢!