【问题标题】:Loop through a "jagged" list循环遍历“锯齿状”列表
【发布时间】:2016-06-01 03:40:08
【问题描述】:

所以我有这个清单:

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

【问题讨论】:

  • 您的列表首先应该是dict{"NYC Football": ["NY Giants", "NY Jets"], "NYC Hockey": [...], ...}。有可能做出这样的改变吗?
  • 是的。我想我可以循环遍历该字典的每个键中的值,对吧?
  • 是的。您现在拥有的称为关联列表,其中元素 0 是映射到元素 1 的键,元素 2 映射到元素 3,等等。它本质上是列表形式的 dict 的表示,但使用 dict允许您强制执行结构,以便您的代码不必迎合格式错误的列表的可能性。

标签: python loops jagged-arrays


【解决方案1】:

您可以使用以下内容:

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

【讨论】:

  • 好的。凉爽的。我会试试的。谢谢
【解决方案2】:

循环遍历外部列表,并且仅当项目是列表时,对其进行迭代并打印其项目:

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)

【讨论】:

    【解决方案3】:

    首先,请不要使用名单作为名单。您将隐藏内置列表,这迟早会给您带来难以检测的错误。

    正如 chepner 在 cmets 中已经提到的,我强烈建议将您的列表转换为字典,以便获得清晰的运动:团队映射。

    >>> 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']
    

    我认为字典的顺序并不重要。如果是,您可以使用来自collections 模块的OrderedDict

    >>> 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多