【问题标题】:How to extract strings out of tuples in python如何从python中的元组中提取字符串
【发布时间】:2020-07-22 09:51:12
【问题描述】:

这是我的元组列表,每个元组都有一个字符串和两个布尔值:

[('r', True, True), (True, 'g', True), (True, True, 'b')]

我想把上面的变成这样:

['r', 'g', 'b']

即用其中的字符串替换列表中的每个元组。

注释:

1-假设我不知道每个元组中每个字符串的位置,所以我无法通过索引得到它

2-假设我有太多的元组。

我需要一个可以应用于列表中任意数量的元组的函数

【问题讨论】:

    标签: python string list tuples


    【解决方案1】:

    嵌套列表理解应该可以满足您的需要。

    >>> tups = [('r', True, True), (True, 'g', True), (True, True, 'b')]
    >>> [x for t in tups for x in t if isinstance(x, str)]
    ['r', 'g', 'b']
    

    【讨论】:

      【解决方案2】:

      您也可以这样做,获取每个元组的第一个 str,并在找到其余部分后停止测试:

      data = [('r', True, True), (True, 'g', True), (True, True, 'b')]
      
      out = [ next(value for value in tup if isinstance(value, str)) for tup in data]
      
      print(out)
      #['r', 'g', 'b']
      

      【讨论】:

      • @RiccardoBucco 根据我的时间安排,这个解决方案比我的慢两倍。为长度为 3 的元组构建生成器比仅对其进行迭代需要更长的时间。当然,对于更长的元组,这个答案仍然可以。
      • @timgeb 没错。由于您提到的原因,我没想到在这种情况下它会更快,而且我只想将此解决方案用于更长的数据。不过,我只是做了一些快速的计时,因为我对第一条评论感到惊讶。我还发现它慢了一倍,但令我惊讶的是,当元组的大小加倍时它已经变得更快了。我原以为建造发电机要贵得多……
      【解决方案3】:

      您还可以使用itertools.chain.from_iterable() 展平列表,然后使用isinstance() 仅过滤str 类型:

      >>> from itertools import chain
      >>> l = [('r', True, True), (True, 'g', True), (True, True, 'b')]
      >>> [x for x in chain.from_iterable(l) if isinstance(x, str)]
      ['r', 'g', 'b']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-13
        • 1970-01-01
        • 1970-01-01
        • 2018-05-31
        • 1970-01-01
        • 2018-04-12
        • 1970-01-01
        相关资源
        最近更新 更多