-->

词典使用,而不是在Python动态变量名(Dictionary use instead of dyn

2019-08-03 07:04发布

我有车的配置很长的文本文件。 在每行一卡车的一些性质被列为一个字符串。 每个属性具有字符串,例如在其自己的固定宽度的空间:

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

现在,你看有没有对3轴货车太多的结果。 但是,如果我有一个12轴转向架的“可能”组合的数量就会失控。 问题是,在现实中你不会看到在12轴转向架轴间距的所有“可能”的组合。 有一些组合(我不知道是哪的人,也要弄明白是我的目标)与一些比组合的“可能”数量少得多。

我想代码来创建列表和与定义我上面如果只有这样的组合存在提到的属性字符串填充。 我想,也许我应该创建一个变量名,如列表:

truck_0300[]
truck_0301[]
truck_0310[]
truck_0311[]

在飞行。 然而,从我在旧金山和其他来源的阅读,这是强烈反对。 你会怎么做使用字典的概念呢? 据我所知,字典就像2个维数组,用钥匙(在我的案件的钥匙会是这样的truck_0300,truck_0301等)和值对(再次出现在我的情况下,该值可能会是保持实际字符串列出了属于对应的卡车类型),但我无法弄清楚如何创建字典,并具有可变键和值填充它。

任何有识之士将受到欢迎! 多谢!

Answer 1:

你是绝对正确的,它几乎总是一个坏主意,试图在一个范围内创建“动态变量”。 字典通常是建立对象的集合随着时间的推移和参考还给他们的答案...

我不完全理解你的应用程序和格式,但一般定义和使用你的字典它是这样的:

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)

所有你需要做的就是定义如何产生一个比较关键。 在这种情况下,我只是告诉它取值为重点。 对于这样的,你只是告诉它拉从对象的索引或属性真的只是按键的功能,你可以把它更加高效使用operator模块,使关键功能是在C语言,而不是在蟒蛇的拉姆达:

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])


Answer 2:

如果按键的数量超过10000,那么这种方法是不可行的。 否则,定义一个字典d = {}和做一个循环在你的线路:

key = line[:4]
if not key in d.keys():
    d[key] = []
d[key] += [somevalue]

我希望这有帮助。



Answer 3:

下面是从字符串输出的完整解决方案:

from collections import namedtuple, defaultdict

# lightweight class
Truck = namedtuple('Truck', 'weights spacings')

def parse_truck(s):
    # convert to array of numbers
    numbers = [int(''.join(t)) for t in zip(s[::2], s[1::2])]

    # check length
    n = numbers[0]
    assert n * 2 == len(numbers)
    numbers = numbers[1:]

    return Truck(numbers[:n], numbers[n:])

trucks = [
    parse_truck("031028331004"),
    ...
]

# dictionary where every key contains a list by default
trucks_by_spacing = defaultdict(list)

for truck in trucks:
    # (True, False) instead of '10'
    key = tuple(space > 6 for space in truck.spacings)
    trucks_by_spacing[key].append(truck)

print trucks_by_spacing

print trucks_by_spacing[True, False]


文章来源: Dictionary use instead of dynamic variable names in Python