mar*_*ion 2 python variables dictionary list dynamic-variables
我有一个很长的文本文件,有卡车配置.在每一行中,卡车的一些属性被列为字符串.每个属性在字符串中都有自己的固定宽度空间,例如:
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
Run Code Online (Sandbox Code Playgroud)
举个例子:
031028331004
Run Code Online (Sandbox Code Playgroud)
指:
number of axles = 3
first axle weight = 10
second axle weight = 28
third axle weight = 33
first spacing = 10
second spacing = 4
Run Code Online (Sandbox Code Playgroud)
现在,您对我的文件结构有了一个了解,这是我的问题:我想将这些卡车分组在不同的列表中,并根据轴间距命名列表.假设我使用布尔类型的方法,如果间距小于6,则布尔值为1,如果大于6,则布尔值为0.为了澄清,三轴卡车的可能结果变为:
00 #Both spacings > 6
10 #First spacing < 6, second > 6
01 #First spacing > 6, second < 6
11 #Both spacings < 6
Run Code Online (Sandbox Code Playgroud)
现在,正如您所看到的,3轴卡车没有太多结果.但是,如果我有一个12轴卡车,"可能"组合的数量会变得混乱.事实是,实际上你不会看到12轴卡车中轴间距的所有"可能"组合.有一些组合(我不知道哪些组合,但要弄明白是我的目标),其数量远远低于"可能"的组合数量.
我希望代码创建列表并使用定义上面提到的属性的字符串填充它们(如果只存在这样的组合).我想也许我应该用变量名创建列表,例如:
truck_0300[]
truck_0301[]
truck_0310[]
truck_0311[]
Run Code Online (Sandbox Code Playgroud)
在飞行中.但是,从我在SF和其他来源中读到的内容来看,强烈建议不要这样做.你会如何使用字典概念?据我所知,词典就像二维数组,有一个键(在我的例子中键会像truck_0300,truck_0301等)和值对(在我的情况下,值也可能是包含实际字符串的列表)属于相应的卡车类型),但我无法弄清楚如何创建该字典,并用变量键和值填充它.
任何见解都会受到欢迎!谢谢你!
你肯定是正确的,尝试在范围内创建"动态变量"几乎总是一个坏主意.字典通常是随着时间的推移建立一个对象集合并引用它们的答案......
我不完全了解您的应用程序和格式,但一般来说,定义和使用您的字典它看起来像这样:
trucks = {}
trucks['0300'] = ['a']
trucks['0300'].append('c')
trucks['0300'].extend(['c','d'])
aTruck = trucks['0300']
Run Code Online (Sandbox Code Playgroud)
现在因为这些中的每一个都应该是你的字符串列表,你可能只想使用defaultdict,并告诉它使用列表作为非existant键的默认值:
from collections import defaultdict
trucks = defaultdict(list)
trucks['0300']
# []
Run Code Online (Sandbox Code Playgroud)
请注意,即使它是一个不包含任何条目的全新字典,"truck_0300"键仍会返回一个新列表.这意味着您无需检查密钥.只需追加:
trucks = defaultdict(list)
trucks['0300'].append('a')
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
您所要做的就是定义如何生成比较密钥.在这种情况下,我只是告诉它将值作为关键.对于这样的关键函数,你只是告诉它从对象中提取索引或属性,你可以通过使用operator模块使关键函数在C中而不是在python中作为lambda 来提高效率:
from operator import itemgetter
...
print max(d.iteritems(), key=itemgetter(1))
#('c', 50)
Run Code Online (Sandbox Code Playgroud)
itemgetter 创建一个新的callable,它将从循环传入的元组中提取第二个项目.
现在假设每个值实际上是一个列表(类似于您的结构).我们将它列为数字列表,并且您希望找到具有最大总数的列表的键:
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])
Run Code Online (Sandbox Code Playgroud)