2

トラック構成を含む長いテキスト ファイルがあります。各行には、トラックのいくつかのプロパティが文字列としてリストされています。各プロパティには、次のように、文字列内に独自の固定幅スペースがあります。

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 です。明確にするために、3 軸トラックで考えられる結果は次のようになります。

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

急いで。しかし、私が SF やその他の情報源で読んだことから、これは強くお勧めできません。辞書の概念を使用してどのようにしますか? 辞書は、キー(私の場合、キーはtruck_0300、truck_0301など)と値のペア(私の場合、値はおそらく実際の文字列を保持するリストになるでしょう)を持つ2次元配列のようなものであることを理解しています対応するトラックの種類に属しています)、しかし、その辞書を作成し、変数のキーと値を入力する方法がわかりませんでした。

どんな洞察も大歓迎です!本当にありがとう!

4

3 に答える 3

5

スコープで「動的変数」を作成しようとするのはほとんどの場合悪い考えであることは間違いありません。辞書は通常、時間の経過とともにオブジェクトのコレクションを構築し、それらを参照するための答えです...

あなたのアプリケーションとフォーマットを完全には理解していませんが、一般的に辞書を定義して使用するには、次のようになります。

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']
# []

エントリを含まないまったく新しい dict であったとしても、「truck_0300」キーは新しいリストを返すことに注意してください。これは、キーを確認する必要がないことを意味します。追加するだけです:

trucks = defaultdict(list)
trucks['0300'].append('a')

defaultdictキーを事前に定義する必要がないため、おそらくAが必要です。あなたがその準備ができているとき、それはそこにあります。

最大値のキーを取得する

あなたのコメントから、辞書の最大値でキーを取得する方法の例を次に示します。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モジュールを使用して、キー関数がラムダとして Python ではなく C にあるようにすることで、より効率的にすることができます。

from operator import itemgetter
...
print max(d.iteritems(), key=itemgetter(1))
#('c', 50)

itemgetterループによって渡されたタプルから 2 番目の項目をプルする新しい 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])
于 2012-11-29T00:10:34.517 に答える
0

文字列から出力までの完全なソリューションは次のとおりです。

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]
于 2012-11-29T00:19:58.893 に答える