如何在Python中将列表pop() n次?

8

我有一个照片选择器函数,它可以计算给定目录中文件的数量,并将它们列成列表。我希望它只返回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
你可以对结果列表进行切片操作,例如 pl[:5]。切片操作会返回前五个元素。 - g.d.d.c
3
如果你需要随机选择5个项目,可以使用 random.sample - Martijn Pieters
哇,我没有想到那个!把它作为答案发布,这样我就可以关闭这个问题了。 - Timur
4个回答

11

我将立即发布几个答案。获取列表的一部分最简单的方法是使用slice符号:

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

如果你真的想要从列表中弹出一个元素,可以使用以下方法:

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

如果你想要从列表中随机选择一些选项,这可能是最有效的方法:

import random
random.sample(range(10), 3)

1
谢谢您详细的回答!我会在8分钟内接受它,现在SO不让我接受。 - Timur
不知怎么的,if语句不起作用,但while语句却完美运行。谢谢。 - Aditya Rajgor

3

在大多数语言中,pop()方法会从集合中移除并返回最后一个元素。那么如果想要同时移除和返回n个元素,该怎么办呢?

def getPhotos(num):
    return [pl.pop() for _ in range(0,num)]

3

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

last_photos = photos[5:]

这将返回一个浅拷贝,因此任何列表的编辑都会反映在另一个列表中。如果您不希望出现这种行为,则应首先进行深层复制。

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

编辑:

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


这将返回除了最后五张照片之外的所有照片。正确的方法是像g.d.d.c建议的那样使用photos[:5] - Ihor Kaharlichenko
1
这不会返回5个元素。它将返回比列表长度少5个元素。 - g.d.d.c
@g.d.d.c 对不起,我以为他想要“弹出”列表5次,意思是获取不包括最后5个元素的列表... - Jens Timmerman
1
@JensTimmerman 那么“去掉最后5个元素的列表”仍然是 photos[:-5]。但是[5:]会跳过前5个元素。 - aneroid

1
快速简单 -
a = list("test string")
print(a[5:])#['s', 't', 'r', 'i', 'n', 'g']
a[:5] = []
print(a)#['s', 't', 'r', 'i', 'n', 'g']

第二个解决方案是最好的,因为它是原地操作,更接近于 pop() - anishtain4
没错。第一个是展示它的工作原理。只需反转切片并将其设置为空列表即可。 - user7387072

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接