2011-12-21 1 views
0
#!/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», полный словарей, т. Е. "Беспроводная сеть". Я хочу, чтобы перебирать этот список «для networkDict в networkAddList» и передать сам словарь в моей функции «addWireless»Итерировать набор словарей и передать вложенные словари функции

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

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

Какие заставляет меня думать, что python думает, что passDict - это строка, поэтому я думаю, что мне нужны индексы строк, то есть 0 или что-то, а не ключевое «имя». Я новичок в python, но мне придется много чего делать, поэтому я надеюсь, что кто-то может указать мне в правильном направлении, поскольку я думаю, что это довольно просто. Но я не могу изменить основную идею, т. Е. Список словарей.

+0

Не пишите «[update: tuple]« Просто исправьте это. Вопрос должен стоять один. История изменений сохраняется StackOverflow. И история изменений не имеет значения. Просто задайте вопрос ** правильно ** пожалуйста. Игнорируйте любые исторические ссылки. Правильные и полные полезны для других. История изменений на самом деле не очень полезна. –

+0

Я вижу вашу точку, обновил название до его оригинала. – acidprime

+0

Возвращаясь, он перестает быть правильным. Вы связываетесь с созданием кортежа словарей. Пожалуйста, исправьте вопрос, чтобы сказать «tuple». Не '[update: tuple]'. Просто кортеж, так как это синтаксис, который вы используете. Если вопрос не "почему не'() 'ограничивает список?" В этом случае спросите об этом. –

ответ

2

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

print type(passedDict) 

Когда вы создаете свой кортеж одним элементом, вам нужна трасса iling ",". Также обратите внимание, что кортеж отличается от списка в 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

Спасибо за ваш краткий ответ, советы и образец кода. Я решил выбрать это как ответ, хотя я хотел упомянуть, что другие в теме пришли к такому же выводу. Спасибо, что помогли с синтаксической ошибкой. – acidprime

0

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

# A list of all SSIDs 
networkAddList = (WirelessNetwork) 

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

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

Ну, это кортеж, а не список. Списки Singleton ('[foo]') работают отлично, без конечной запятой, так же как и кортежи с элементами 2+. – delnan

+0

tuple - неизменный список, но все же список объектов – fabrizioM

+0

«tuple» - это «tuple», а не «list». Оба эти последовательности в основном отличаются своей изменчивостью, но это не делает их эквивалентными. Даже не отдаленно.Конечно, они могут, возможно, быть достаточно похожими, чтобы быть объединенными неформально как «списки», но особенно здесь, на SO, мы должны быть точными. – delnan

0

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

networkAddList = [WirelessNetwork] # or, list(WirelessNetwork) 
+0

Спасибо, мне на самом деле не нужно мутировать, поэтому я думаю, что буду придерживаться кортежа – acidprime

-1

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

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

networkAddList = (WirelessNetwork,)

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

+0

Все это неправильно. Прежде чем, по крайней мере, он повторил словарь и передал хотя бы ключи. Теперь ваш код будет просто перебирать ключи и передавать отдельные символы. – Abhijit

+0

Вы правы - похоже, что это не было бы очень хорошим решением. Дайте мне минут десять, чтобы пересмотреть это. – Makoto