【问题标题】:All items from a tuple in Python [duplicate]Python中元组中的所有项目[重复]
【发布时间】:2013-10-22 18:03:50
【问题描述】:

我有一个元组,它由一些整数元组和一些整数组成,比如((1, 2), 3, (4, 5), 6)。现在我需要它的所有整数。我写道:

def get_all_items(iterable):
    t = []

    for each in iterable:
        if type(each) == int:
            t.append(each)
        else:
            t.extend(each)

    return tuple(t)

它对我有用。有没有更好的方法来做到这一点?

【问题讨论】:

  • 你确定只有一个层次结构,即你没有一个元组元组的元组吗?

标签: python tuples


【解决方案1】:

不要忘记作弊方式

>>> from ast import literal_eval
>>> t = ((1, 2), 3, (4, 5), 6)
>>> literal_eval(repr(t).translate(None, '()'))
(1, 2, 3, 4, 5, 6)

【讨论】:

  • 代码让我发笑的情况并不多见……我认为吸引我的是“作弊方式”
【解决方案2】:

我认为你的方式很好。这是另一种使用递归的方法,它适用于任意深度嵌套的可迭代结构:

def get_all_items(iterable):
    try:
        result = []
        for element in iterable:
            result += detuple(element)
        return result
    except TypeError:
        return [iterable]

此外,了解您所描述的操作称为“扁平化”数据结构可能会很有用。

【讨论】:

    【解决方案3】:
    from itertools import chain
    
    def flatten(items):
      def renest():
        for item in items:
          try:
            yield iter(item)
          except TypeError:
            yield iter([item])
      return list(chain.from_iterable(renest()))
    

    【讨论】:

    • @DSM 是的,我忘了itertools 不是魔法。
    • 很容易忘记,因为它经常如此。 :^)
    【解决方案4】:
    import itertools
    itertools.chain.from_iterable(
        item if hasattr(item, '__iter__') else (item,)
            for item in iterable 
    )
    

    【讨论】:

      【解决方案5】:

      你可以像这样简化你的代码

      def get_all_items(iterable):
          t = []
          for each in iterable:
              t.extend(list(each) if isinstance(each, tuple) else [each])
          return tuple(t)
      
      print get_all_items(((1, 2), 3, (4, 5), 6))
      

      输出

      (1, 2, 3, 4, 5, 6)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-18
        • 1970-01-01
        • 2022-10-04
        • 1970-01-01
        • 1970-01-01
        • 2020-09-29
        • 1970-01-01
        相关资源
        最近更新 更多