【问题标题】:Slicing Tuples in a List of Lists in Python在 Python 中的列表列表中切片元组
【发布时间】:2021-10-14 05:32:20
【问题描述】:

我在列表列表中有元组,并且想只提取元组中的一些元素。输入数据示例如下。

# input 
[[('ab', 0.026412873688749918), ('dc', 0.016451082731822664), ('on', 0.014278088125928066),
  ('qc', 0.009752817881775656), ('mn', 0.008332886637563352), ('nt', 0.008250535392602258),
  ('nsw', 0.006874273287824427), ('bar', 0.005878684829852004), ('tor', 0.005741627328513831),
  ('wds', 0.004119216502907735)],
 [('nb', 0.03053649661493629), ('ns', 0.01925207174326825), ('ham', 0.016207228280183325),
  ('bra', 0.013390785663058102), ('nia', 0.00878166482558038), ('knxr', 0.004648856466085521),
  ('nwm', 0.004463444159552605), ('md', 0.004377821331080258), ('ut', 0.004165890522922745),
  ('va', 0.0037484060754341083)]]

我要做的是获取元组中的第一项。

# output
[['ab', 'dc', 'on', 'qc', 'mn', 'nt', 'nsw', 'bar', 'tor', 'wds'],
['nb', 'ns', 'ham', 'bra', 'nia', 'knxr', 'nwm', 'md', 'ut', 'va']]

【问题讨论】:

  • 尝试使用list comprehension
  • 你试过什么?只生成第一个元素的 listcomp 的 listcomp 是直接的方法。
  • 提问时最好附上您的代码。为您提供一些提示。使用索引获取每个元组的first element 使用for-loop 遍历元组列表。在 for 循环中,使用索引语法 tuple[0] 访问每个元组的第一个元素,并调用列表。 append(object) 以 object 作为元组的第一个元素,将每个第一个元素附加到 list 。

标签: python list tuples


【解决方案1】:
input = [
          [('ab', 0.026412873688749918), ('dc', 0.016451082731822664), ('on', 0.014278088125928066),
          ('qc', 0.009752817881775656), ('mn', 0.008332886637563352), ('nt', 0.008250535392602258),
          ('nsw', 0.006874273287824427), ('bar', 0.005878684829852004), ('tor', 0.005741627328513831),
          ('wds', 0.004119216502907735)],
         
         [('nb', 0.03053649661493629), ('ns', 0.01925207174326825), ('ham', 0.016207228280183325),
          ('bra', 0.013390785663058102), ('nia', 0.00878166482558038), ('knxr', 0.004648856466085521),
          ('nwm', 0.004463444159552605), ('md', 0.004377821331080258), ('ut', 0.004165890522922745),
          ('va', 0.0037484060754341083)]
        ]

如 cmets 所示,您可以使用列表推导来实现:

[[idx for idx, val in x] for x in input]

# Result
[['ab', 'dc', 'on', 'qc', 'mn', 'nt', 'nsw', 'bar', 'tor', 'wds'],
 ['nb', 'ns', 'ham', 'bra', 'nia', 'knxr', 'nwm', 'md', 'ut', 'va']]

实现这一点的更复杂的方法是使用zip() 将元组的第一个元素与第二个元素分开,如下所示:

[('ab', 'dc', 'on', 'qc', 'mn', 'nt', 'nsw', 'bar', 'tor', 'wds'),
(0.026412873688749918,0.016451082731822664,0.014278088125928066,0.009752817881775656,0.008332886637563352,0.008250535392602258,0.006874273287824427,0.005878684829852004,0.005741627328513831,0.004119216502907735)]

这种方法可以使用:

[list(list(zip(*x))[0]) for x in input]

# Result
[['ab', 'dc', 'on', 'qc', 'mn', 'nt', 'nsw', 'bar', 'tor', 'wds'],
 ['nb', 'ns', 'ham', 'bra', 'nia', 'knxr', 'nwm', 'md', 'ut', 'va']]

【讨论】:

    【解决方案2】:

    您可以使用循环或列表推导来执行此操作。

    输入数据是包含元组的列表列表。使用 tuple[0] 访问元组的第一个元素并将其保存到一个空列表中,如下所示:-

    input_data = [
            [('ab', 0.026412873688749918), ('dc', 0.016451082731822664), ('on', 0.014278088125928066),
              ('qc', 0.009752817881775656), ('mn', 0.008332886637563352), ('nt', 0.008250535392602258),
              ('nsw', 0.006874273287824427), ('bar', 0.005878684829852004), ('tor', 0.005741627328513831),
              ('wds', 0.004119216502907735)],
             [('nb', 0.03053649661493629), ('ns', 0.01925207174326825), ('ham', 0.016207228280183325),
              ('bra', 0.013390785663058102), ('nia', 0.00878166482558038), ('knxr', 0.004648856466085521),
              ('nwm', 0.004463444159552605), ('md', 0.004377821331080258), ('ut', 0.004165890522922745),
              ('va', 0.0037484060754341083)]
        ]
        
    data_list = []
    for x in input_data:
        d_list = []
        for y in x:
            d_list.append(y[0])
            
        data_list.append(d_list)
    
    # Result...
    [['ab', 'dc', 'on', 'qc', 'mn', 'nt', 'nsw', 'bar', 'tor', 'wds'],
     ['nb', 'ns', 'ham', 'bra', 'nia', 'knxr', 'nwm', 'md', 'ut', 'va']]
    
            
    

    使用列表推导:- 这是通过删除 append() 方法和初始空列表来编写上述 for 循环的一种简写方式。

    data_list = [ [y[0] for y in x] for x in input_data ]
        
    # Result...
    [['ab', 'dc', 'on', 'qc', 'mn', 'nt', 'nsw', 'bar', 'tor', 'wds'],
    ['nb', 'ns', 'ham', 'bra', 'nia', 'knxr', 'nwm', 'md', 'ut', 'va']]
    

    【讨论】:

      猜你喜欢
      • 2018-11-21
      • 2020-08-31
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 2018-04-05
      • 1970-01-01
      • 2018-08-31
      相关资源
      最近更新 更多