Выполните итерацию набора словарей и передайте вложенные словари в функцию - PullRequest
0 голосов
/ 21 декабря 2011
#!/usr/bin/python -tt

# A dictionary Of Each New SSID
WirelessNetwork = {}
WirelessNetwork['name'] = 'baz'
WirelessNetwork['type'] = 'bar'
WirelessNetwork['pass'] = 'foo'

# A list of all SSIDs
networkAddList = (WirelessNetwork)

def addWireless(passedDict={}):
  print 'Adding SSID: %s' % passedDict['name']
  print 'Of type: %s' % passedDict['type']
  print 'With Password: %s' % passedDict['pass']

for networkDict in networkAddList:
  addWireless(networkDict)

Итак, у меня есть список «networkAddList», полный словарей, то есть «WirelessNetwork».Я хочу перебрать этот список «для networkDict в networkAddList» и передать сам словарь моей функции «addWireless»

Когда я запускаю приведенный выше пример кода, я получаю следующую ошибку:

TypeError: 'string indices must be integers, not str'

Это заставляет меня думать, что python думает, что с помощью элементадинированная_передача является строка, поэтому я думаю, что мне нужны строковые индексы, т.е. 0 или что-то, а не ключ 'имя'.Я новичок в Python, но мне придется много делать такого рода вещи, поэтому я надеюсь, что кто-нибудь может указать мне правильное направление, так как я думаю, что это довольно просто.Но я не могу изменить основную идею, то есть список словарей.

Ответы [ 4 ]

2 голосов
/ 21 декабря 2011

При отладке в python вы можете подтвердить свое подозрение, что передаваемое значение является строкой с функцией типа:

print type(passedDict)

Когда вы создаете свой кортеж с одним элементом, вам нужен трейлинг ",". Также обратите внимание, что кортеж отличается от списка в Python. Основное отличие состоит в том, что кортежи являются неизменяемыми, а списки - нет.

#!/usr/bin/python -tt

# A dictionary Of Each New SSID
WirelessNetwork = {}
WirelessNetwork['name'] = 'baz'
WirelessNetwork['type'] = 'bar'
WirelessNetwork['pass'] = 'foo'

# A list of all SSIDs
networkAddList = (WirelessNetwork,)

def addWireless(passedDict={}):
  print 'Adding SSID: %s' % passedDict['name']
  print 'Of type: %s' % passedDict['type']
  print 'With Password: %s' % passedDict['pass']

for networkDict in networkAddList:
  addWireless(networkDict)
0 голосов
/ 21 декабря 2011

Просто провел быструю проверку типов, на которые ссылаются, и я считаю, что вы пропустили только последовательную запятую (в WirelessNetwork).

Итак, ваш код будет выглядеть примерно так:

networkAddList = (WirelessNetwork,)

Ваш цикл for будет правильно перебирать словари.

0 голосов
/ 21 декабря 2011

На самом деле это не список, даже с запятой.Это кортеж, который неизменен.Я сообщу об этом на случай, если ваш код захочет добавить что-нибудь к этому позже.

networkAddList = [WirelessNetwork] # or, list(WirelessNetwork)
0 голосов
/ 21 декабря 2011

это не список, это само значение

# A list of all SSIDs
networkAddList = (WirelessNetwork)

с запятой становится списком

# A list of all SSIDs
networkAddList = (WirelessNetwork,)
...