【问题标题】:randomly replace item in list随机替换列表中的项目
【发布时间】:2022-01-10 19:03:14
【问题描述】:

我有两个列表 A =[2,3,4,5,33,42,21]B = [1,11,35,48,19] 我想随机删除列表 B 的两个项目,并用列表 A 中的两个随机项目替换 200 次迭代。我使用了此代码,但只有一项 B 替换为 A。我该怎么做?

import random

A = [2,3,4,5,33,42,21]
B = [1,11,35,48,19]

x = random.randrange(0,5)
i = A[x]
A[x] = B[x]
B[x] = i
print(A)
print(B)

【问题讨论】:

    标签: python list replace


    【解决方案1】:

    使用random.sample

    import random
    
    list_a = [2, 3, 4, 5, 33, 42, 21]
    list_b = [1, 11, 35, 48, 19]
    
    a_index1, a_index2 = random.sample(range(len(list_a)), k=2)
    b_index1, b_index2 = random.sample(range(len(list_b)), k=2)
    list_a[a_index1], list_b[b_index1] = list_b[b_index1], list_a[a_index1]
    list_a[a_index2], list_b[b_index2] = list_b[b_index2], list_a[a_index2]
    

    这里唯一需要添加的就是把它放在一个循环中,循环200次。

    random.sample 从可迭代对象中选择 k 唯一选项,因此不会出现在迭代中两次选择相同整数的情况。

    如果您尝试对list_alist_b 使用相同的索引,您将永远无法替换list_a 中的最后两个元素,因为list_b 更短且没有等效索引。

    编辑:

    关于扩展这个问题:

    目前,索引被解压缩为 2 个变量。当您更改为 k=5 时,您正试图将 5 个值的 list 解压缩为 2 个变量。

    正确的解决方案是让它动态化。

    import random
    
    def swap(list_a, list_b, indexes_to_swap=2):
        a_indexes = random.sample(range(len(list_a)), k=indexes_to_swap)
        b_indexes = random.sample(range(len(list_b)), k=indexes_to_swap)
        for a_index, b_index in zip(a_indexes, b_indexes):
            list_a[a_index], list_b[b_index] = list_b[b_index], list_a[a_index]
    
    list_a = [3,4,15,18,21,35,36,45,47]
    list_b = [0,1,2,5,6,7,8,9,10,11,12,13,14,16,17,19,20,22,23,24,25,26,27,28,29,30,31,32,33,34,37,38,39,40,41,42,43,44,46,48]
    swap(list_a, list_b, 5)
    

    如果你想做 200 次:

    for _ in range(200):
        swap(list_a, list_b, 5)
    

    【讨论】:

    • 我只需要list_b。所以我想随机删除 list_b 的 2 项并从 list_a.@Axe319 中放入 2 项而不是它们
    • 所以您想从list_a 中删除它们?这是否意味着在 4 次迭代后 list_a 将被耗尽?
    • 一个问题,当我更改 list_a = [3,4,15,18,21,35,36,45,47] list_b = [0,1,2,5,6,7,8,9,10,11,12,13,14,16,17,19,20,22,23,24,25,26,27,28,29,30,31,32,33,34,37,38,39,40,41,42,43,44,46,48] 并且我想替换 5 个成员时,但是当我更改 k=5 时,错误是 too many values to unpack。我该怎么做?
    • @mohammadhassanmoayyedian 我编辑并添加了一个示例。
    • 非常感谢您的帮助。@Axe319
    【解决方案2】:

    你差点就吃完了:

    import random
    
    A = [2,3,4,5,33,42,21]
    B = [1,11,35,48,19]
    
    
    for _ in range(400):
        x = random.randrange(0,5)
        A[x], B[x] = B[x], A[x]
    print(A)
    print(B)
    

    您想要循环 400 次,因为您想要为每次迭代更改 2 个项目并且想要迭代 200 次。你也可以这样做:

    import random
    
    A = [2,3,4,5,33,42,21]
    B = [1,11,35,48,19]
    
    
    for _ in range(200):
        x = random.randrange(0,5)
        y = random.randrange(0,5)
        while y == x:
            y = random.randrange(0,5)
        A[x], B[x] = B[x], A[x]
        A[y], B[y] = B[y], A[y]
    print(A)
    print(B)
    

    这具有两个替代品永远不会相同的“好处”(您可能会问过?)

    【讨论】:

    • 好奇心:从技术上讲,这可能永远不会结束 :)
    • 是的,这是真的:(
    • @RiccardoBucco。谢谢。一个问题!我对您的代码进行了 10 次迭代测试,我意识到 B 中只有一个成员发生了变化。这是基于您的代码 [1, 11, 35, 5, 19] 的结果,只有 5 发生了变化。
    猜你喜欢
    • 2012-08-15
    • 2021-12-09
    • 2019-01-09
    • 2019-12-02
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多