2016-08-25 20 views
2

リストから文字列を追加したり減算したりするたくさんの投稿がありますが、それらの項目の数をカウントするのに役立つ必要があります。リストから項目を追加/削除する方法

私はこれらのアイテムを結合して、カウンタだけを繰り返さないようにしたいと思います。

例: 3りんご4つのオレンジ2バナナ

私は呼び出すことがあったかのように、一度に一つの項目を「取る」ことができるようにしたい

: を 「アップルを取る」と私がチェックしていた私の在庫は、私は持っていた: 2りんご4オレンジ2バナナ

私は反対をしたいと思います。アイテムを「ドロップ」して部屋の在庫に追加したいと思います。

今は、一度に1つではなく、一度にすべてのリンゴを拾う方法しか知りません。また、私のアイテムは、各部屋のすべてのアイテムが保管されている別のtxtファイルからプログラムにロードされます。

+0

は 'collections.Counter'を検索します。 – TigerhawkT3

答えて

0

listの代わりにdictionaryを使用することを検討してください。辞書はthingscountsを維持するための理想的です:

from random import choice 

def get_rooms(file_name): 
    rooms = {} 
    with open(file_name) as f: 
     for l in f: 
      room = l.split() 
      room_number = int(room[0]) 
      rooms[room_number] = {} 
      for index, data in enumerate(room[1:], 1): 
       if index % 2: 
        item = data 
       else: 
        rooms[room_number][item] = int(data) 
    return rooms 

def generate_tests(number_of_test_actions): 
    tests = [] 
    for _ in range(number_of_test_actions): 
     tests.append((choice([1,2,3,4,5,6]), 
         choice(['Apple', 'Sword', 'Bow', 'Arrow', 'monkey']), 
         choice(['take', 'drop']))) 
    return tests 

def take_item(room, item): 
    # generates and propagates KeyError exception if item not in room 
    room[item] -= 1 
    if not room[item]: 
     room.pop(item) 

def drop_item(room, item): 
    if item in room: 
     room[item] += 1 
    else: 
     room[item] = 1 

rooms = get_rooms("rooms.txt") 
for room, item, action in generate_tests(10): 
    if action == 'take': 
     print('taking', item, 'from room', room, ':', rooms[room]) 
     try: 
      take_item(rooms[room], item) 
     except KeyError: 
      print('-- Sorry, no', item, 'in room', room, 'to take') 
     else: 
      print('-- took', item, 'from room', room, ':', rooms[room])     
    elif action == 'drop': 
     print('dropping', item, 'in room', room, ':', rooms[room]) 
     drop_item(rooms[room], item) 
     print('-- dropped', item, 'in room', room, ':', rooms[room]) 

rooms.txt

1 Sword 1 Apple 2 
2 Apple 3 
3 Bow 1 Arrow 3 
4 Arrow 5 
5 Bow 1 
6 Arrow 10 

出力

taking Apple from room 3 : {'Arrow': 3, 'Bow': 1} 
-- Sorry, no Apple in room 3 to take 
taking Apple from room 4 : {'Arrow': 5} 
-- Sorry, no Apple in room 4 to take 
dropping monkey in room 6 : {'Arrow': 10} 
-- dropped monkey in room 6 : {'monkey': 1, 'Arrow': 10} 
dropping Apple in room 5 : {'Bow': 1} 
-- dropped Apple in room 5 : {'Apple': 1, 'Bow': 1} 
taking Bow from room 3 : {'Arrow': 3, 'Bow': 1} 
-- took Bow from room 3 : {'Arrow': 3} 
dropping monkey in room 3 : {'Arrow': 3} 
-- dropped monkey in room 3 : {'monkey': 1, 'Arrow': 3} 
dropping Arrow in room 6 : {'monkey': 1, 'Arrow': 10} 
-- dropped Arrow in room 6 : {'monkey': 1, 'Arrow': 11} 
taking Bow from room 5 : {'Apple': 1, 'Bow': 1} 
-- took Bow from room 5 : {'Apple': 1} 
taking Bow from room 4 : {'Arrow': 5} 
-- Sorry, no Bow in room 4 to take 
taking Bow from room 5 : {'Apple': 1} 
-- Sorry, no Bow in room 5 to take 
+0

これは理にかなっています。各部屋のアイテムは、次の形式のtxtファイルからインポートする必要があります。 // 1剣2 Apple 2 // 2 Apple 3 // 3弓1矢印3 // 4 Arrow 5 // 5 Bow 1 // 6 Arrow 10 // 私の在庫はありません。その後、私は各部屋に入ると、一度に1つのアイテムを取ったり、落としたりすることができます。 – Rain

+0

上記をご覧ください –

関連する問題