1

彼がロバなのかシマウマなのかわからない場合、「アルバート」の「スペース」を変更するにはどうすればよいですか?

self.object_attr = {'donkey': {
                              'name': 'roger', 'zone': 'forrest', 'space': [0, 0]}{
                              'name': 'albert', 'zone': 'forrest', 'space': [1, 1]}
                    'zebra': {
                              'name': 'pain', 'zone': 'forrest', 'space': [0, 0]}{
                              'name': 'alesha', 'zone': 'forrest', 'space': [1, 1]}}

print self.object_attr
for species in data.values():
    for animal in species:
        if animal['name'] == 'albert':
            animal['space'] = [50, 50]

#output      this is what object_attr is
{'donkey': {'roger': {'zone': 'forrest', 'space': [0, 0]}, 'albert': {'zone': 'forrest', 'space': [0, 0]}}}


#the error occurs on the "if animal['name'] == 'albert':" line
TypeError: string indices must be integers, not str
4

2 に答える 2

3

編集:提供した出力に基づいて、次のように動作するはずです:

data = {'donkey': {'roger': {'zone': 'forrest', 'space': [0, 0]}, 
                   'albert': {'zone': 'forrest', 'space': [0, 0]}}}

for species in data.values():
    if 'albert' in species:
        species['albert']['space'] = [50, 50]

以下の元の回答:


これを行うための非常に簡単な方法を次に示します。

data = {'donkey': [{'name': 'roger', 'zone': 'forrest', 'space': [0, 0]}, 
                   {'name': 'albert', 'zone': 'forrest', 'space': [1, 1]}],
        'zebra': [{'name': 'roger', 'zone': 'forrest', 'space': [0, 0]},
                  {'name': 'albert', 'zone': 'forrest', 'space': [1, 1]}]}

for species in data.values():
    for animal in species:
        if animal['name'] == 'albert':
            animal['space'] = [50, 50]

または、同等のジェネレーター式を使用します (短いが明確ではありません):

for albert in (a for s in data.values() for a in s if a['name'] == 'albert'):
    albert['space'] = [50, 50]

結果:

>>> pprint.pprint(data)
{'donkey': [{'name': 'roger', 'space': [0, 0], 'zone': 'forrest'},
            {'name': 'albert', 'space': [50, 50], 'zone': 'forrest'}],
 'zebra': [{'name': 'roger', 'space': [0, 0], 'zone': 'forrest'},
           {'name': 'albert', 'space': [50, 50], 'zone': 'forrest'}]}
于 2012-05-30T22:54:28.747 に答える
3

まず、データに句読点が欠けているようです。何が欠けているかについて、私は最善の推測をしました。

data = {'donkey': [{ 'name': 'roger', 'zone': 'forrest', 'space': [0, 0]}, { 'name': 'albert', 'zone': 'forrest', 'space': [1, 1]}],
      'zebra':  [{ 'name': 'roger', 'zone': 'forrest', 'space': [0, 0]}, {'name': 'albert', 'zone': 'forrest', 'space': [1, 1]}]
}

for v in data.values():
    [item.update({'space':[50, 50]}) for item in v if item['name'] == 'albert']

print data

出力

{'donkey': [{'name': 'roger', 'space': [0, 0], 'zone': 'forrest'},
        {'name': 'albert', 'space': [50, 50], 'zone': 'forrest'}],
 'zebra': [{'name': 'roger', 'space': [0, 0], 'zone': 'forrest'},
       {'name': 'albert', 'space': [50, 50], 'zone': 'forrest'}]}
于 2012-05-30T22:46:39.203 に答える