sorted() 函数不适用于数字列表
sorted() function not working on numeric list
我试图获取目录中所有文件的顺序,所以我尝试使用 sorted() 函数对分别命名为 folder/frame0.jpg
的每个文件的数值进行排序。问题是我得到的输出看起来像这样
yourlieinapril1/frame1094.jpg
yourlieinapril1/frame1095.jpg
yourlieinapril1/frame1096.jpg
yourlieinapril1/frame1097.jpg
yourlieinapril1/frame1098.jpg
yourlieinapril1/frame1099.jpg
yourlieinapril1/frame1100.jpg
yourlieinapril1/frame110.jpg
yourlieinapril1/frame1101.jpg
每当它遍历以十为底的数字时,列表就会返回到一个较小的数字
我试着用下面的代码修复它,但它仍然不能正常工作
def animate(folder):
l = list()
a = list()
for filename in os.listdir(folder):
path = (os.path.join(folder, filename))
if path.endswith('jpg'):
num = ''
for i in range(len(path)):
try:
p = int(path[i])
num += str(path[i])
except:
pass
try:
check = a[len(a) - 1]
if len(check) > len(num):
if num != '0':
num += ('0')
path = folder + '/frame' + num + '.jpg'
except:
pass
a.append(num)
l.append(path)
f = sorted(l)
f = list(dict.fromkeys(f))
有人知道我应该怎么做吗?
为 sorted
指定一个 key
参数,告诉它如何对不同于标准字母顺序比较的字符串进行排序。
>>> files = [
... "yourlieinapril1/frame1094.jpg",
... "yourlieinapril1/frame1095.jpg",
... "yourlieinapril1/frame1096.jpg",
... "yourlieinapril1/frame1097.jpg",
... "yourlieinapril1/frame1098.jpg",
... "yourlieinapril1/frame1099.jpg",
... "yourlieinapril1/frame1100.jpg",
... "yourlieinapril1/frame110.jpg",
... "yourlieinapril1/frame1101.jpg",
... ]
>>> sorted(files, key=lambda s: int(s[21:-4]))
['yourlieinapril1/frame110.jpg', 'yourlieinapril1/frame1094.jpg', 'yourlieinapril1/frame1095.jpg', 'yourlieinapril1/frame1096.jpg', 'yourlieinapril1/frame1097.jpg', 'yourlieinapril1/frame1098.jpg', 'yourlieinapril1/frame1099.jpg', 'yourlieinapril1/frame1100.jpg', 'yourlieinapril1/frame1101.jpg']
如果您的真实数据集更复杂(即领先的非数字部分是可变的,并且您想对其进行排序加上数值),您的 key
函数可能会做一些事情,比如返回一个前导 str
和尾随 int
.
的元组
您需要根据文件名中的数字对文件名进行索引(首先提取第一个数字),然后对数字进行零填充,并对索引进行排序。像这样:
import os
def index_frames(folder):
indexed_files = {}
for filename in os.listdir(folder):
path = (os.path.join(folder, filename))
if path.endswith('jpg'):
# extract the number from the filename and pad with zeros so that they will sort correctly
num = ''.join([s for s in filename if s.isdigit()]).zfill(15)
# insert into a dict with key as padded number
indexed_files[num] = path
return indexed_files
index_frames = index_frames('yourlieinapril1')
for key in sorted(index_frames.keys()):
# these will print in order because they have been sorted by the index
print(index_frames[key])
我试图获取目录中所有文件的顺序,所以我尝试使用 sorted() 函数对分别命名为 folder/frame0.jpg
的每个文件的数值进行排序。问题是我得到的输出看起来像这样
yourlieinapril1/frame1094.jpg
yourlieinapril1/frame1095.jpg
yourlieinapril1/frame1096.jpg
yourlieinapril1/frame1097.jpg
yourlieinapril1/frame1098.jpg
yourlieinapril1/frame1099.jpg
yourlieinapril1/frame1100.jpg
yourlieinapril1/frame110.jpg
yourlieinapril1/frame1101.jpg
每当它遍历以十为底的数字时,列表就会返回到一个较小的数字 我试着用下面的代码修复它,但它仍然不能正常工作
def animate(folder):
l = list()
a = list()
for filename in os.listdir(folder):
path = (os.path.join(folder, filename))
if path.endswith('jpg'):
num = ''
for i in range(len(path)):
try:
p = int(path[i])
num += str(path[i])
except:
pass
try:
check = a[len(a) - 1]
if len(check) > len(num):
if num != '0':
num += ('0')
path = folder + '/frame' + num + '.jpg'
except:
pass
a.append(num)
l.append(path)
f = sorted(l)
f = list(dict.fromkeys(f))
有人知道我应该怎么做吗?
为 sorted
指定一个 key
参数,告诉它如何对不同于标准字母顺序比较的字符串进行排序。
>>> files = [
... "yourlieinapril1/frame1094.jpg",
... "yourlieinapril1/frame1095.jpg",
... "yourlieinapril1/frame1096.jpg",
... "yourlieinapril1/frame1097.jpg",
... "yourlieinapril1/frame1098.jpg",
... "yourlieinapril1/frame1099.jpg",
... "yourlieinapril1/frame1100.jpg",
... "yourlieinapril1/frame110.jpg",
... "yourlieinapril1/frame1101.jpg",
... ]
>>> sorted(files, key=lambda s: int(s[21:-4]))
['yourlieinapril1/frame110.jpg', 'yourlieinapril1/frame1094.jpg', 'yourlieinapril1/frame1095.jpg', 'yourlieinapril1/frame1096.jpg', 'yourlieinapril1/frame1097.jpg', 'yourlieinapril1/frame1098.jpg', 'yourlieinapril1/frame1099.jpg', 'yourlieinapril1/frame1100.jpg', 'yourlieinapril1/frame1101.jpg']
如果您的真实数据集更复杂(即领先的非数字部分是可变的,并且您想对其进行排序加上数值),您的 key
函数可能会做一些事情,比如返回一个前导 str
和尾随 int
.
您需要根据文件名中的数字对文件名进行索引(首先提取第一个数字),然后对数字进行零填充,并对索引进行排序。像这样:
import os
def index_frames(folder):
indexed_files = {}
for filename in os.listdir(folder):
path = (os.path.join(folder, filename))
if path.endswith('jpg'):
# extract the number from the filename and pad with zeros so that they will sort correctly
num = ''.join([s for s in filename if s.isdigit()]).zfill(15)
# insert into a dict with key as padded number
indexed_files[num] = path
return indexed_files
index_frames = index_frames('yourlieinapril1')
for key in sorted(index_frames.keys()):
# these will print in order because they have been sorted by the index
print(index_frames[key])