我目前正在做一个uni项目,该项目要求我在嵌套列表中随机移动项目
假设我有一个嵌套列表,其中包含一个人的名字、他们晚餐吃的食物以及他们吃饭的时间,看起来像这样:
food = [['person1', 'food1', 'dinner time1'],
['person2', 'food2', 'dinner time2'],
['person3', 'food3', 'dinner time3'],
...]
有没有一种方法可以让我随机地重新排列列表,这样每个人都会有不同的食物和晚餐时间,看起来像这样:
food_reshuffle = [['person2', 'food3', 'dinner time3'],
['person1', 'food2', 'dinner time2'],
['person3', 'food1', 'dinner time1']
...]
您可以将列表分成列,然后将每列洗牌并重新组合
要将列作为列表获取,请使用^{} function ,外部列表作为独立的参数应用,并使用
*args
语法zip()
返回元组,但是如果我们想洗牌,我们需要列表,所以我使用map()
来转换每个元组因为每个行都作为参数传入,
zip()
将每行的第一个值配对为一个元组,将下一行配对为另一个元组,以此类推现在您有三个单独的列表,每个列表都可以传递给^{} :
然后再次与
zip()
重新组合:演示:
如果您只想将第一个列洗牌,而将其他列作为一个整体洗牌(因此您最终将} 从输入序列中随机抽样,只需恰好具有相同的长度。这恰好与使用^{得到相同的结果,但无需先复制输入序列并在适当的位置进行洗牌:
'personA'
与对('foodB', 'dinner timeB')
配对),然后我会先洗牌外部列表或其副本,然后分离出people列进行洗牌和重新组合。为了避免复制,您可以使用^{其结果是:
我使用了另一个“技巧”,我们在赋值中使用
*other
,将zip(...)
的第一个结果赋值给people
,并将其他所有结果赋值给other
否则,如果有数量可变的列都需要单独洗牌,只需在
zip(*food)
上使用一个循环,并将每个洗牌列附加到columns
列表中,这样就可以再次将这些列与zip(*columns)
重新组合可轻松组合成一个函数:
如果要相对于其他列洗牌第一列,可以提取并重新分配它:
如果需要对整个内容进行洗牌,则可以在第一列相对于其他列进行洗牌后执行此操作:
如果要按人排序,也可以这样做:
相关问题 更多 >
编程相关推荐