【问题标题】:Append to list after shuffle (Python)随机播放后附加到列表(Python)
【发布时间】:2016-03-09 22:50:45
【问题描述】:

纽比问题: 我无法弄清楚为什么下面的代码不起作用。我正在尝试制作一个嵌套列表,其中 10 个嵌套列表中的每一个都以不同的顺序排列。我得到的是同一个列表以相同的顺序重复 10 次。

所以我想要: [[1, 2, 4, 3], [4, 2, 3, 1], [2, 4, 3, 1]]

但我得到: [[2, 3, 1, 4], [2, 3, 1, 4], [2, 3, 1, 4]]

<pre>from random import shuffle

myList = ["file1", "file2", "file3", "file4"]
longList = []

for x in range(0,10):
    shuffle(myList)
    longList.append(myList)

print(longList)<code>

提前致谢!

D

【问题讨论】:

    标签: python append shuffle


    【解决方案1】:

    这是因为longList内的对象引用都是指向myList的对象。

    正如here 解释的那样,random.shuffle 会更改 myList,因此每次调用 random.shuffle 时,它都会覆盖其内容。

    一种解决方案是在每次随机播放列表时克隆列表,并且有多种方法可用于此 (How to clone a list in Python)。

    在以下代码中,我选择对其进行切片:

    from random import shuffle
    
    myList = ["file1", "file2", "file3", "file4"]
    longList = []
    
    for x in range(0,10):
        shuffle(myList)
        longList.append(myList[:])
    

    【讨论】:

    • 每次遇到这样的问题,我都会对自己说“这是最后一次让我失望了!”。没有。
    • 啊!当然!现在完全有道理。谢谢,皮埃尔!
    【解决方案2】:

    Shuffle 就地工作,它返回 None。 奇怪的是它在 10 次尝试中返回相同的列表。可能您这样做的次数不够多,因此 shuffle 一次会返回几次相同的结果。尝试对其进行大量测试。 也许可以:

    random.seed(x)
    

    在循环内部。

    【讨论】:

    • 这是random.shuffle??哦,伙计,我完全没有意识到这是洗牌......呃......好吧。我正在删除我的。 +1。感谢您提出这个问题,顺便说一句。
    • 谢谢!我有一个解决方法,即通过将 shuffle 行放在“with open...”行的一侧,然后在每次迭代时写入文件,将每一行写入文件。但是为什么上面的方法有效而我的原始代码对我来说不是一个谜! (pastebin.com/A2p1gXSQ)
    • @user2011285 像这样将代码放在 cmets 中确实不容易看。您可以制作代码的粘贴箱。 pastebin.com
    猜你喜欢
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2014-04-02
    相关资源
    最近更新 更多