6

我有一个照片选择器功能,可以计算给定目录中的文件数并列出它们。我希望它只返回 5 个图像 URL。这是功能:

from os import listdir
from os.path import join, isfile

def choose_photos(account):
    photos = []
    # photos dir
    pd = join('C:\omg\photos', account)
    # of photos
    nop = len([name for name in listdir(location) if isfile(name)]) - 1
    # list of photos
    pl = list(range(0, nop))
    if len(pl) > 5:
        extra = len(pl) - 5
        # How can I pop extra times, so I end up with a list of 5 numbers
    shuffle(pl)
    for p in pl:
        photos.append(join('C:\omg\photos', account, str(p) + '.jpg'))
    return photos
4

4 回答 4

9

我会继续发布几个答案。获取一些列表的最简单方法是使用slice符号:

pl = pl[:5] # get the first five elements.

如果您真的想从列表中弹出,这可行:

while len(pl) > 5:
  pl.pop()

如果您从该列表中随机选择选项,这可能是最有效的:

import random
random.sample(range(10), 3)
于 2012-08-20T15:42:23.047 回答
3

由于这是一个列表,您可以通过切片获得最后五个元素:

last_photos = photos[5:]

这将返回一个浅拷贝,因此任何列表中的任何编辑都将反映在另一个列表中。如果你不想要这种行为,你应该先做一个深拷贝。

import copy
last_photos = copy.deepcopy(photos)[5:]

编辑:

当然应该是 [5:] 而不是 [:-5] 但如果你真的想“弹出”它 5 次,这意味着你想要没有最后 5 个元素的列表......

于 2012-08-20T15:40:56.630 回答
2

在大多数语言中,pop() 从集合中移除并返回最后一个元素。所以要同时删除和返回 n 个元素,怎么样:

def getPhotos(num):
    return [pl.pop() for _ in range(0,num)]
于 2018-02-04T15:50:03.517 回答
1

快速简单 -

a = list("test string")
print(a[5:])#['s', 't', 'r', 'i', 'n', 'g']
a[:5] = []
print(a)#['s', 't', 'r', 'i', 'n', 'g']
于 2019-12-01T09:39:38.567 回答