2016-02-19 2 views
0

Так что у меня этот список:Петля через «рваной» список

list = ["NYC Football", ["NY Giants","NY Jets"], "NYC Hockey", ["NY Rangers", "NY Islanders", "NJ Devils"]] 

Как бы я Переберите в этом списке, и только распечатать:

NY Giants 
NY Jets 
NY Rangers 
NY Islanders 
NJ Devils 
+2

Ваш список должен быть 'dict' в первую очередь:' { "NYC Футбол": [ "NY Giants", "Нью-Йорк Джетс"], "Нью-Йорк Хоккей": [...]. ..} '. Можно ли это изменить? – chepner

+0

Да, это так. Наверное, я могу потом просунуть значения в каждом ключе этого дикта? –

+0

Да. Теперь у вас есть список ассоциаций, где элемент 0 является ключом, который сопоставляется с элементом 1, элемент 2 сопоставляется с элементом 3 и т. Д. Это, по сути, представление формы 'dict' в списке, но с использованием' dict' позволяет вам применять структуру таким образом, чтобы ваш код не учитывал возможность искаженного списка. – chepner

ответ

2

Вы можете использовать следующее:

my_list = ["NYC Football", ["NY Giants","NY Jets"], "NYC Hockey", ["NY Rangers", "NY Islanders", "NJ Devils"]] 

for item in my_list: 
    if type(item) == list: 
     for i in item: 
      print(i) 

Выход

NY Giants 
NY Jets 
NY Rangers 
NY Islanders 
NJ Devils 

Кроме того: вы не должны использовать ключевое слово list в качестве имени переменной. В моем примере я изменил его на my_list.

+0

Хорошо. Круто. Я пытаюсь это сделать. благодаря –

0

Цикл по внешнему списку, и только если элемент списка, перебрать его и распечатать его элементы:

for thing in my_list: #don't call it "list" 
    if isinstance(thing, list): 
     for other in thing: 
      print(other) 

Другой способ:

for thing in filter(lambda x: isinstance(x, list)): 
    for other in thing: 
     print(other) 
2

Прежде всего, пожалуйста, не Используйте список имен для списка. Вы закроете встроенный список, который рано или поздно заставит вас обнаружить ошибку.

Как уже упоминалось в комментариях к chepner, я настоятельно рекомендую преобразовать ваш список в словарь, чтобы иметь чистый спорт: сопоставление команд.

>>> lst = ["NYC Football", ["NY Giants","NY Jets"], "NYC Hockey", ["NY Rangers", "NY Islanders", "NJ Devils"]] 
>>> teams = dict(zip(*[iter(lst)]*2)) 
>>> teams 
{'NYC Football': ['NY Giants', 'NY Jets'], 'NYC Hockey': ['NY Rangers', 'NY Islanders', 'NJ Devils']} 

Чтобы получить спорт, выпуск

>>> teams.keys() 
['NYC Football', 'NYC Hockey'] 

Чтобы получить команды, выпуск

>>> teams.values() 
[['NY Giants', 'NY Jets'], ['NY Rangers', 'NY Islanders', 'NJ Devils']] 

Вы могли бы также не-гнездо этот список с itertools.chain:

>>> list(chain.from_iterable(teams.values())) 
['NY Giants', 'NY Jets', 'NY Rangers', 'NY Islanders', 'NJ Devils'] 

Я предположил, что порядок t он не имеет значения. Если это так, вы можете использовать OrderedDict от модуля collections.

>>> from collections import OrderedDict 
>>> teams = OrderedDict(zip(*[iter(lst)]*2)) 
>>> for team in chain.from_iterable(teams.values()): 
...  print(team) 
... 
NY Giants 
NY Jets 
NY Rangers 
NY Islanders 
NJ Devils