在 Python 中的列表列表中切片元组

Slicing Tuples in a List of Lists in Python

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

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

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

输入数据是包含元组的列表列表。使用 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']]

        

使用列表理解:- shorthand 通过删除 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']]
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)]
        ]

如评论中所示,您可以使用列表理解来实现此目的:

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