在Python中使用字典而不是动态变量名
作者:互联网
我有一个带有卡车配置的长文本文件.在每一行中,卡车的某些属性都列为字符串.每个属性在字符串中都有自己固定的宽度空间,例如:
2 chracters = number of axles
2 characters = weight of the first axle
2 characters = weight of the second axle
...
2 characters = weight of the last axle
2 characters = length of the first axle spacing (spacing means distance between axles)
2 characters = length of the second axle spacing
...
2 characters = length of the last axle spacing
举个例子:
031028331004
指:
number of axles = 3
first axle weight = 10
second axle weight = 28
third axle weight = 33
first spacing = 10
second spacing = 4
现在,您对我的文件结构有了一个想法,这是我的问题:我想将这些卡车分组到单独的列表中,并以轴距命名该列表.假设我使用的是布尔类型的方法,并且如果间距小于6,则布尔值为1;如果间距大于6,则布尔值为0.为明确起见,三轴卡车的可能结果为:
00 #Both spacings > 6
10 #First spacing < 6, second > 6
01 #First spacing > 6, second < 6
11 #Both spacings < 6
现在,如您所见,三轴卡车的结果并不多.但是,如果我有12轴卡车,那么“可能的”组合的数量就成了麻烦.问题是,实际上您不会看到12轴卡车的所有“可能”轴间距组合.有某些组合(我不知道是哪一种,但要弄清楚是我的目标),其数量比组合的“可能”数量少得多.
如果仅存在这样的组合,我希望代码创建列表并用定义上述属性的字符串填充它们.我以为也许我应该用变量名创建列表,例如:
truck_0300[]
truck_0301[]
truck_0310[]
truck_0311[]
在飞行中.但是,根据我在SF和其他来源中所读的内容,强烈建议不要这样做.您将如何使用字典概念来做到这一点?我知道字典就像二维数组,带有一个键(在我的情况下,键将是truck_0300,truck_0301等)和值对(在我的情况下,值可能是包含实际字符串的列表)属于相应的卡车类型),但是我不知道如何创建该词典,并使用可变键和值填充该词典.
任何见识都将受到欢迎!
谢谢一群!
解决方法:
您肯定是正确的,尝试在示波器中创建“动态变量”几乎总是一个坏主意.字典通常是随着时间的推移建立对象集合并对其进行引用的答案.
我不完全了解您的应用程序和格式,但是总体上来说,定义和使用字典看起来像这样:
trucks = {}
trucks['0300'] = ['a']
trucks['0300'].append('c')
trucks['0300'].extend(['c','d'])
aTruck = trucks['0300']
现在,由于这些字符串中的每一个都应该是字符串列表,因此您可能只想使用defaultdict,并告诉它使用列表作为不存在的键的默认值:
from collections import defaultdict
trucks = defaultdict(list)
trucks['0300']
# []
请注意,即使它是不包含任何条目的全新字典,“ truck_0300”键仍会返回新列表.这意味着您不必检查密钥.只需追加:
trucks = defaultdict(list)
trucks['0300'].append('a')
defaultdict可能就是您想要的,因为您根本不需要预定义键.当您准备就绪时,它就在那里.
获取最大值的密钥
根据您的评论,这是一个如何获取具有字典最大值的键的示例.这很简单,因为您仅使用max并定义如何确定用于比较的键:
d = {'a':10, 'b':5, 'c':50}
print max(d.iteritems(), key=lambda (k,v): v)
# ('c', 50)
d['c'] = 1
print max(d.iteritems(), key=lambda (k,v): v)
# ('a', 10)
您所要做的就是定义如何生成比较键.在这种情况下,我只是告诉它以值作为键.对于像这样的简单键函数,只是告诉它从对象中提取索引或属性,您可以使用运算符模块提高其效率,以使键函数在C中而不是在Lambda中使用python:
from operator import itemgetter
...
print max(d.iteritems(), key=itemgetter(1))
#('c', 50)
itemgetter创建一个新的可调用对象,该可调用对象将从循环传入的元组中提取第二个项目.
现在假设每个值实际上是一个列表(类似于您的结构).我们将其制成一个数字列表,您想找到包含列表总数最大的键:
d = {'a': range(1,5), 'b': range(2,4), 'c': range(5,7)}
print max(d.iteritems(), key=lambda (k,v): sum(v))
# ('c', [5, 6])
标签:dynamic-variables,python,variables,list,dictionary 来源: https://codeday.me/bug/20191011/1891223.html