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的离题话题。