2

うまくいけば、私はそれをタイトルで十分に説明しましたが、ここに私が持っているものがあります:

入力データ:

Mushroom Kingdom, Mario

Hyrule, Link

Mushroom Kingdom, Bowser

Zebes, Samus

Zebes, Metroid

そして、私はこのようなものを実行したい、

# The next three lines establish that I'll be reading proc as a file
import subprocess
cmd = 'external command that returns the above data'
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)

homeworlds = {}

while True:
  line = proc.stdout.readline().split(',')
  if line:
    # If line isn't empty
    homeword = line[0]
    person = line[1]

    homeworlds[homeword] = list.append[person] # Good logic? Bad syntax?

  else:
   break

目標は、私が電話できるようになることです。

print homeworlds['Mushroom Kingdom']

リストを返します

Mario, Bowser
4

6 に答える 6

3

ここを使用する方が簡単defaultdictです。split()また、パラメータなしで現在呼び出しています。あなたが本当にやりたいことはで分割されます,。したがって、を呼び出す必要がありますsplit(',')

したがって、コードは次のようになります。

homeworlds = collections.defaultdict(list)
while True:
  line = proc.stdout.readline().split(',')
  if line:
    # If line isn't empty
    homeworld = line[0].strip()
    person = line[1].strip()

    homeworlds[homeworld].append(person)

  else:
    break
于 2012-07-30T16:51:01.193 に答える
2
 if not homeword in homeworlds:
    homeworlds[homeword] = list()
 homeworlds[homeword].append(person)
于 2012-07-30T16:48:31.807 に答える
1

使用するdefaultdict

from collections import defaultdict
homeworlds = defaultdict(list)

homeworlds[homeword].append(person)
于 2012-07-30T16:51:47.570 に答える
0

これを試して:

if homeword not in homeworlds:
    homeworlds[homeword] = []
homeworlds[homeword].append(person)

これは、のエントリがあるかどうかを確認しhomewordますhomeworld。ない場合は、そこにリストを追加します。そうすれば、リストがあることが確実にわかるhomeworld[homeword]ので、それを呼び出すことができます.append(person)

于 2012-07-30T16:49:54.117 に答える
0

これが一貫性のあるエレガントなソリューションです(他の回答から部分的にインスピレーションを得ています):

#!/bin/env python
from collections import defaultdict

lines = """Mushroom Kingdom, Mario

Hyrule, Link

Mushroom Kingdom, Bowser

Zebes, Samus

Zebes, Metroid
"""

homeworlds = defaultdict(list)

for line in lines.splitlines():
    if line and ',' in line:
        key, value = line.split(',')
        homeworlds[key].append(value.trim())

print(homeworlds)
于 2012-07-30T16:59:49.883 に答える
0
Python 2.7.3rc2 (default, Apr 22 2012, 22:30:17) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> input_data = [('Mushroom Kingdom', 'Mario'),
...  ('Hyrule', 'Link'),
...  ('Mushroom Kingdom', 'Bowser'),
...  ('Zebes', 'Samus'),
...  ('Zebes', 'Metroid')]
>>> homeworlds = {}
>>> for homeword,person in input_data:
...   homeworlds.setdefault(homeword, []).append(person)
... 
>>> homeworlds
{'Hyrule': ['Link'], 'Zebes': ['Samus', 'Metroid'], 'Mushroom Kingdom': ['Mario', 'Bowser']}
>>> print(homeworlds['Mushroom Kingdom'])
['Mario', 'Bowser']
>>> print("{0}".format(', '.join(homeworlds['Mushroom Kingdom'])))
Mario, Bowser

あなたの場合、forループにスワップインします:'input_data' for'line'

于 2012-07-30T17:07:42.843 に答える