Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在Python3.4中随机化两个列表并保持顺序_Python 3.x - Fatal编程技术网

Python 3.x 在Python3.4中随机化两个列表并保持顺序

Python 3.x 在Python3.4中随机化两个列表并保持顺序,python-3.x,Python 3.x,我问的问题基本上和刚才问的完全一样,但是对于Python3.4.0 在3.4.0中,此代码: a = ["Spears", "Adele", "NDubz", "Nicole", "Cristina"] b = [1, 2, 3, 4, 5] combined = zip(a, b) random.shuffle(combined) a[:], b[:] = zip(*combined) 不起作用。在3.4.0中,正确的方法是什么?将combined=zip(a,b)更改为combined

我问的问题基本上和刚才问的完全一样,但是对于Python3.4.0

在3.4.0中,此代码:

a = ["Spears", "Adele", "NDubz", "Nicole", "Cristina"]
b = [1, 2, 3, 4, 5]

combined = zip(a, b)
random.shuffle(combined)

a[:], b[:] = zip(*combined)

不起作用。在3.4.0中,正确的方法是什么?

combined=zip(a,b)
更改为
combined=list(zip(a,b))
。您需要一个列表,而不是迭代器,才能进行适当的无序排列。

在Python 3中,
zip
返回一个迭代器而不是列表,因此在无序排列之前将其强制转换为列表:

combined = list(zip(a, b))

在Python3中,
zip
返回一个
zip
对象(即Python2中的
itertools.izip

您需要强制它实现列表:

combined = list(zip(a, b))

如果内存紧张,您可以编写自己的洗牌函数,以避免创建压缩列表。Python中的一个不是很复杂

def shuffle(self, x, random=None, int=int):
    """x, random=random.random -> shuffle list x in place; return None.

    Optional arg random is a 0-argument function returning a random
    float in [0.0, 1.0); by default, the standard random.random.

    Do not supply the 'int' argument.
    """

    randbelow = self._randbelow
    for i in reversed(range(1, len(args[0]))):
        # pick an element in x[:i+1] with which to exchange x[i]
        j = randbelow(i+1) if random is None else int(random() * (i+1))
        x[i], x[j] = x[j], x[i]
您的功能可以是:

def shuffle2(a, b):
    for i in reversed(range(1, len(a))):
        j = int(random.random() * (i+1))
        a[i], a[j] = a[j], a[i]
        b[i], b[j] = b[j], b[i]
将任意数量的列表一起洗牌

def shuffle_many(*args):
    for i in reversed(range(1, len(args[0]))):
        j = int(random.random() * (i+1))
        for x in args: 
            x[i], x[j] = x[j], x[i]
乙二醇


非常感谢。这很有效。你能告诉我为什么稍后在代码中强制转换到列表效果不好吗?i、 e.combined=zip(a,b)random.shuffle(list(combined))print(list(combined))返回一个空列表
random.shuffle
shuffle到位。执行
list(combined)
返回一个新列表(并使用
combined
),因此执行
random.shuffle
会将其洗牌,然后立即将其丢弃。再次执行
list(combined)
会给您一个空列表,因为您在上一步中使用了
zip
对象。哇。这是一个很好的回答。非常感谢。:)
>>> import random
>>> def shuffle_many(*args):
...     for i in reversed(range(1, len(args[0]))):
...         j = int(random.random() * (i+1))
...         for x in args: 
...             x[i], x[j] = x[j], x[i]
... 
>>> a = ["Spears", "Adele", "NDubz", "Nicole", "Cristina"]
>>> b = [1, 2, 3, 4, 5]
>>> shuffle_many(a, b)
>>> a
['Adele', 'Spears', 'Nicole', 'NDubz', 'Cristina']
>>> b
[2, 1, 4, 3, 5]