2014-09-19 40 views
0

我已经得到了下面的示例阵次数最多:过滤一个数组,只检索字符串开头

arr = ["0001_xyz_01", "0001_xyz_02", "0001_xyz_03", "0002_xyz_01", "0002_xyz_02", "0002_xyz_03", "0003_xyz_01", "0003_xyz_02", "0003_xyz_03"] 

从这个数组,我想创建一个仅包含字符串的一个新的阵列与开始最高的数字。因此,新的阵列看起来像:

new_arr = ["0003_xyz_01", "0003_xyz_02", "0003_xyz_03"] 

需要注意的是:

  • 在构建new_arr只有前4个字符应该看 - 该字符串的其余部分必须被忽略。
  • arr中物品的排列顺序可能会发生变化。
  • arr中的物品数量可能会有变化。

我想我可以用filter,但我不知道如何:我

new_arr = filter(lambda x: <some-filtering-here>, arr) 

回答

1

不漂亮的解决方案,但你可以尝试这...

>>> new_arr = [x for x in arr if x.startswith(sorted([y[:4] for y in arr])[-1])] 
['0003_xyz_01', '0003_xyz_02', '0003_xyz_03'] 

为了解释:

  • sorted([y[:4] for y in arr])[-1]对每个字符串的前4个字符列表进行排序并选择最高值。

  • [x for x in arr if x.startswith(...)]是一个列表理解选取从这个最高值开始的字符串。

+0

+1解释。我喜欢你的解决方案,因为与其他解决方案相比,它不使用“split”。 – NinjaFart 2014-09-19 21:07:21

+1

谢谢!很高兴,如果我的答案是有用的。 – 2014-09-19 21:10:54

+0

对不起,我太快了。有些事情是错的。当它应该是'['0003_xyz_01','0003_xyz_02','0003_xyz_03']'时,它输出'['0003_xyz_03','0003_xyz_03','0003_xyz_03']'。 – NinjaFart 2014-09-19 21:21:47

0

不知道是否有这样做的更Python的方式。但是你可以做的两个步骤:

arr = ["0001_xyz_01", "0001_xyz_02" ... 
highest = max([x.split('_')[0] for x in arr] 
new_arr = [x for x in arr if x.startswith(highest)] 
0
>>> [t for t in arr if max(j[0] for j in [i.split('_') for i in arr]) in t] 
['0003_xyz_01', '0003_xyz_02', '0003_xyz_03'] 
>>> 

在下面你可以分别看到的是什么呢所有的代码块:

>>> [i.split('_') for i in arr] 
[['0001', 'xyz', '01'], ['0001', 'xyz', '02'], ['0001', 'xyz', '03'], ['0002', 'xyz', '01'], ['0002', 'xyz', '02'], ['0002', 'xyz', '03'], ['0003', 'xyz', '01'], ['0003', 'xyz', '02'], ['0003', 'xyz', '03']] 
>>> [j[0] for j in [i.split('_') for i in arr]] 
['0001', '0001', '0001', '0002', '0002', '0002', '0003', '0003', '0003'] 
>>> [max(j[0] for j in [i.split('_') for i in arr])] 
['0003'] 
相关问题