【问题标题】:How to extract certain items from list?如何从列表中提取某些项目?
【发布时间】:2017-04-26 18:35:47
【问题描述】:

假设我有这些列表:

a = ['2009','2010a','2010b','2011','2012a','2012b','2012c','2013a','2014b'] 
b = ['2008a','2008b'] 

并且我需要编写一个代码来提供以下列表:

#If I provide list a as the input:
a1 = ['2010a','2010b']
a2 = ['2012a','2012b','2012c']
a3 = ['2013a']
a4 = ['2014b']

#If I provide list b as the input:
b1 = ['2008a','2008b'] 

目前,我做了以下工作:

  1. 遍历输入列表中的每一项
  2. 检查每个项目的最后一个字符串是否为字母(e.g. a of '2010a')
  3. 检查下一项的最后一个字符串是否也是字母(e.g. '2010a' and '2010b')
  4. 继续检查直到下一个项目的最后一个字符串不是字母(e.g. '2010a','2010b','2011'),并收集以前以字母结尾的项目(e.g. '2010a' and '2010b')
  5. 检查收集的项目是否具有相同的数字(e.g. '2010a' and '2010b', but not '2013a' and '2014b'),并根据需要生成子列表。

上述步骤有效,但很长。我想知道python库中是否有任何代码/技巧可以使代码更短,看起来更干净/更优雅。

【问题讨论】:

  • 分离以字母字符结尾的项目后,itertools.groupby 可以按前 4 个字符组织这些项目。

标签: python python-2.7 list python-3.x


【解决方案1】:

你首先需要检查最后一个字符是否是字母:

>>> a = ['2009','2010a','2010b','2011','2012a','2012b','2012c','2013a','2014b']
>>> number_and_letters = [x for x in a if x[-1].isalpha()]
['2010a', '2010b', '2012a', '2012b', '2012c', '2013a', '2014b']

然后,您可以使用 itertools.groupbylambdax[:4] 来按数字对字符串进行分组:

>>> import itertools
>>> list(list(words) for year, words in itertools.groupby(number_and_letters, lambda x: x[:4]))
[['2010a', '2010b'], ['2012a', '2012b', '2012c'], ['2013a'], ['2014b']]

groupby 期望字符串已经排序,这里似乎就是这种情况。

最后,您会得到一个列表作为输出,而不是 4 个不同的变量。使用 4 个元素的列表通常比使用 4 个不同的变量要容易得多。

【讨论】:

  • 我稍微修改它以适应我的其他代码:comp_dict = {key:[item for item in group] for key,group in groupby(number_and_letters, lambda x: x[:-1])}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 2020-09-07
  • 2019-11-15
  • 1970-01-01
相关资源
最近更新 更多