2017-06-26 7 views
1

私はPythonにはかなり新しいので、私は非常に単純なトラックツードアの割り当てをシミュレートしたいと思います。私は、実現可能なドアをトラックごとに配置したいと思っています。しかし、私が以下のシミュレーションを実行している場合は、実現可能なドアの一覧が表示されます(T1とT2の両方のドアが一緒に使えるようになります):私のソリューションはアイテムごとではなく1つのリストに印刷されるのはなぜですか?

['D1'、 'D2'、 'D1'、 'D2 」、 'D3']

しかし、私は持っていたい:

T1 = [ 'D1' 'D2']

T2 = [ 'D1' 'D2'、 'D3' ]

これは重要なことですが、この後、私はそのコストに応じて異なるドアを比較し、それに基づいて最良のd各トラック 't'のためのoor。あなたは内側のリストに別のリストを作成し、リストにそれを追加する必要が

# define dataset trucks and doors 
trucks = ['T1', 'T2'] 
doors = ['D1', 'D2', 'D3', 'D4'] 

# define arrival time trucks 
arr_time = { 
    'T1': 08.00, 
    'T2': 09.00, 
} 

# define when door 'd' is free 
free_time_door = { 
    'D1': 07.00, 
    'D2': 08.00, 
    'D3': 09.00, 
    'D4': 10.00 
} 

# define when door 'd' is feasible for truck 't' to assign to 
def feasible_doors(trucks): 
    feasible = [] 
    for t in trucks: 
     for d in doors: 
      if arr_time[t] >= free_time_door[d]: 
       feasible.append(d) 
    return feasible 

print (feasible_doors(trucks)) 
+1

あなたの関数では、たった一つのリストfeasableが作成されているためです。なぜ魔法のように2つのリストにはならないのに驚いたのですか? – timgeb

+0

あなたはただ一つのリスト( 'feasible')しかインスタンス化していないので、あなたは一つのリストしか取得しません。私はあなたが '' t in trucks 'ループの中で ''実現可能' 'を作り、作成された ''実現可能なものすべてを含むリストを返そうと思っています。 – NiziL

+0

また、['datetime'](https://docs.python.org/2/library/datetime.html#module-datetime)、あるいはそれ以上の[' arrow'](http:// arrow .readthedocs.io/en/latest /)ライブラリを使用して、日付または時刻に操作を行います。 –

答えて

1

私はあなたが各トラックの実現可能な扉を取得するためにdefaultdictを使用することを示唆しています1つの変数で

from collections import defaultdict 

# define when door 'd' is feasible for truck 't' to assign to 
def feasible_doors(trucks): 
    feasible = defaultdict(list) 
    for t in trucks: 
     for d in doors: 
      if arr_time[t] >= free_time_door[d]: 
       feasible[t].append(d) 
    return feasible 

print (feasible_doors(trucks)) 

の出力は以下となります。

{'T2': ['D1', 'D2', 'D3'], 'T1': ['D1', 'D2']} 

EDIT:トラックのためにドアを選択するにはdefaultdict

詳細は、あなたは自分の辞書のパラメータとして鍵を渡すことがあります。

feasible = feasible_doors(trucks) 

print feasible['T1'] 
# ['D1', 'D2'] 

items()

for key, values in feasible.items(): 
    if key == 'T1': 
    doors = ', '.join(values) 
    print('The truck: {truck} have {doors} doors free.'.format(truck=key, doors=doors)) 
# The truck: T1 have D1, D2 doors free. 
+0

ありがとう、これは私が求めているものなのですから!しかし、私はまた、ただ一つのトラックのために実現可能なドアを印刷することができるようにしたいと思います。だから実現可能なすべてのドアを印刷しているのではなく、T1の実現可能なドアを印刷したいと思います。 (上記のコメントを参照)。それをどうやって行うのか考えていますか? – Eline

+0

こんにちは@Eline、私は私の例があなたの使用のために十分であることを願っています。また、私がするよりも物事を良くする方法を説明してくれるので、遠慮なくドキュメンテーションを見てください。 –

+1

ありがとう、あなたの答えは非常に有用です!そして私は時間表示に異なる値を使うべきだということに同意しますが、今のところ私はこれらの値でこの問題を解決したかったのです。どうもありがとうございました! – Eline

1

が返さ:

# define when door 'd' is feasible for truck 't' to assign to 
def feasible_doors(trucks): 
    feasible = [] 
    for t in trucks: 
     feasible_truck = [] 
     for d in doors: 
      if arr_time[t] >= free_time_door[d]: 
       feasible_truck.append(d) 
     feasible.append(feasible_truck) 
    return feasible 
+0

ありがとうございます!私は今何が間違っているかを見ます。しかし今、私はすべてのトラックのための実現可能な扉を持つリストの代わりに、ただ1つのトラックの実現可能な扉を印刷したいと思う。私は印刷しようとしました。 feasible_doors( 'T1')とfeasible_doors(trucks [0])、それから 'KeyError' T ''というエラーが表示されます。トラック「T1」のキー値を呼び出すのに何か問題があることを理解しています。しかし、なぜ私は理解していない。 私はT1のために実現可能なドアを印刷したいと思います。それをどうやって行うのか考えていますか? もう一度私はPythonには新しいので、ご協力いただきありがとうございます! – Eline

関連する問題