2017-04-26 80 views
1

假设我有这些列表:如何从列表中提取某些项目?

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库中是否有任何代码/技巧可以使代码更短,看起来更清洁/更优雅。

+1

你写了什么? –

+1

一旦你分离了以_alphabet_字符结尾的项目,[itertools.groupby](https://docs.python.org/3/library/itertools.html#itertools.groupby)就可以组织这些项目的前4个字符。 – wwii

+0

一般来说,你必须在它发生之前尝试做它 –

回答

3

首先,您需要检查,如果最后一个字符是字母:

>>> 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.groupbyx[:4]一个lambda到组字符串:

>>> 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个不同的变量要容易得多。

+0

太棒了!非常感谢!对不起,我的声望很低,不能在你的回答中加上赞许。 – Lam

+0

我稍微修改它以适合其他代码:'comp_dict = {key:[item for item in group] for key,group in groupby(number_and_letters,lambda x:x [: - 1])}' – Lam

+0

You and @wwii让我的一天:) ..祝你有美好的一天:) – Lam