过滤数组并仅检索以最高编号开头的字符串

时间:2014-09-19 20:51:08

标签: python arrays linux

我有以下样本数组:

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)

3 个答案:

答案 0 :(得分: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(...)]是一个列表理解,选择以此最高值开头的字符串。

答案 1 :(得分:0)

我不知道是否有更多的Pythonic方法。但你可以分两步完成:

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)]

答案 2 :(得分: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']