Python 3.x 如何筛选特定类型的python列表

Python 3.x 如何筛选特定类型的python列表,python-3.x,Python 3.x,我有一个字符串列表。每个字符串在格式中具有相同的长度/字符数 xyzw01.ext或xyzv02.ext等 比如说 list 1: ['ABCJ01.ext','CDEJ02.ext','ADEJ01.ext','CDEJ01.ext','ABCJ02.ext','CDEJ03.ext'] list 2: ['ABCJ01.ext','ADEJ01.ext','CDEJ01.ext','RPNJ01.ext','PLEJ01.ext'] 我想从这些列表中创建新的列表,其中只包含数字最高的字符串

我有一个字符串列表。每个字符串在格式中具有相同的长度/字符数
xyzw01.ext
xyzv02.ext

比如说

list 1: ['ABCJ01.ext','CDEJ02.ext','ADEJ01.ext','CDEJ01.ext','ABCJ02.ext','CDEJ03.ext']
list 2: ['ABCJ01.ext','ADEJ01.ext','CDEJ01.ext','RPNJ01.ext','PLEJ01.ext']
我想从这些列表中创建新的列表,其中只包含数字最高的字符串。 所以从清单1中我想得到

['ADEJ01.ext','ABCJ02.ext','CDEJ03.ext']
而对于列表2,我希望得到相同的列表,因为所有的数字都是01

是否有一种“简单”的方法来实现这一点?

您可以使用和

输出:

['ABCJ02.ext', 'CDEJ03.ext', 'ADEJ01.ext']
['ABCJ01.ext', 'ADEJ01.ext', 'CDEJ01.ext', 'RPNJ01.ext', 'PLEJ01.ext']
您可以使用和

输出:

['ABCJ02.ext', 'CDEJ03.ext', 'ADEJ01.ext']
['ABCJ01.ext', 'ADEJ01.ext', 'CDEJ01.ext', 'RPNJ01.ext', 'PLEJ01.ext']

最简单的方法可能是使用中间数据结构,如dict,根据列表项名称的第一部分将其排序到bucket中,然后为每个bucket取最大数量。我们可以只使用内置的
max()
,而不使用键,因为给定的词典排序可以找到最大的。如果这还不够,您可以使用更多的正则表达式从项中取出数字,并将其用作键

import re

def filter_list(lst):
    prefixes = {}
    for item in lst:
        # use regex to isolate the non-numeric characters at the start of the string
        prefix = re.match(r'^([^0-9]*)', item).group(1)
        # make a bucket based on each prefix, and put the item in it
        prefixes.setdefault(prefix, [])
        prefixes[prefix].append(item)
    # make a list comprehension taking the maximum item from each bucket
    return [max(value) for value in prefixes.values()]
在python 3.7+中,这应该保留每个前缀第一次出现时的列表顺序(即,
CDEJ03.ext
将在输出中位于
ADEJ01.ext
之前,因为
CDEJ02.ext
在输入中位于它之前)。

要以与原始列表、行为完全相同的顺序获得输出,您需要显式地重新分配密钥,而不是使用
.setdefault()
,可能使用类似于
prefixes[prefix]=prefixes[prefix]if-in-prefixes-in-else[]
的模式。最简单的方法可能是使用中间数据结构,与dict类似,根据列表项名称的第一部分将其排序到bucket中,然后为每个bucket取最大值。我们可以只使用内置的
max()
,而不使用键,因为给定的词典排序可以找到最大的。如果这还不够,您可以使用更多的正则表达式从项中取出数字,并将其用作键

import re

def filter_list(lst):
    prefixes = {}
    for item in lst:
        # use regex to isolate the non-numeric characters at the start of the string
        prefix = re.match(r'^([^0-9]*)', item).group(1)
        # make a bucket based on each prefix, and put the item in it
        prefixes.setdefault(prefix, [])
        prefixes[prefix].append(item)
    # make a list comprehension taking the maximum item from each bucket
    return [max(value) for value in prefixes.values()]
在python 3.7+中,这应该保留每个前缀第一次出现时的列表顺序(即,
CDEJ03.ext
将在输出中位于
ADEJ01.ext
之前,因为
CDEJ02.ext
在输入中位于它之前)。
要以与原始列表、行为完全相同的顺序获得输出,您需要显式地重新分配密钥,而不是使用
.setdefault()
,可能使用类似
前缀[prefix]=prefixes[prefix]if prefixes in prefixes else[]

的模式。请参阅本帖以及如何提供询问“我怎么做X?”被认为是SO的离题话题。请参阅上的这篇文章,如何提供提问“我怎么做X?”被认为是SO的离题话题。