Python洗牌只有一个参数

时间:2016-01-25 11:43:23

标签: python python-2.7 shuffle

我有一个python列表,我可以轻松排序:

l2 = sorted(l1, key=lambda k: k["id"])
print l2

打印:

[ {'id': '02', 'time': 'bl' }, {'id': '02', 'time': 'm24' },  {'id': '05', 'time': 'bl' }, {'id': '05', 'time': 'm12' }, {'id': '05', 'time': 'm24' }, {'id': '09', 'time': 'm12' }]

但是我现在想要使用shuffle,仅根据id键对此列表进行随机播放,我想在{{{>}保留相对顺序 {1}}密钥。有没有办法做到这一点?

按相对顺序,我的意思是保留按键time的原始排序。例如,可能的解决方案是:

time

可以检查每个[ {'id': '09', 'time': 'm12' }, {'id': '05', 'time': 'bl' }, {'id': '05', 'time': 'm12' }, {'id': '05', 'time': 'm24' }, {'id': '02', 'time': 'bl' }, {'id': '02', 'time': 'm24' }] 的项目是否按键time进行了部分排序。

3 个答案:

答案 0 :(得分:0)

感谢您的投入,我相信一个有效的解决方案是:

import random
# l2 is sorted totally:
l2 =[ {'id': '02', 'time': 'bl' }, {'id': '02', 'time': 'm24' },  {'id': '05', 'time': 'bl' }, {'id': '05', 'time': 'm12' }, {'id': '05', 'time': 'm24' }, {'id': '09', 'time': 'm12' }]
idss = set([i['id'] for i in l2])
ids = list(idss)

random.shuffle(ids)
l3 = []

for i in ids:
    for j in l2:
        if i == j['id']:
            # order by `time` is implicit
            l3.append(j)
print l3

因为我需要每次循环遍历整个数组l2,所以没有什么非常棒的,但代码是可读的。

答案 1 :(得分:0)

喜欢这个吗?

from random import shuffle

l2 = [ {'id': '02', 'time': 'bl' }, {'id': '02', 'time': 'm24' },  {'id': '05', 'time': 'bl' }, {'id': '05', 'time': 'm12' }, {'id': '05', 'time': 'm24' }, {'id': '09', 'time': 'm12' }]
print(l2)

keys = [item['id'] for item in l2]
shuffle(keys)

for n in range(len(keys)):
    l2[n]['id'] = keys[n]

print(l2)

打印:

>>> [{'id': '02', 'time': 'bl'}, {'id': '02', 'time': 'm24'}, {'id': '05', 'time': 'bl'}, {'id': '05', 'time': 'm12'}, {'id': '05', 'time': 'm24'}, {'id': '09', 'time': 'm12'}]
>>> [{'id': '02', 'time': 'bl'}, {'id': '09', 'time': 'm24'}, {'id': '05', 'time': 'bl'}, {'id': '02', 'time': 'm12'}, {'id': '05', 'time': 'm24'}, {'id': '05', 'time': 'm12'}]

答案 2 :(得分:-1)

您想要的是将数据保存在组中,然后随机播放组。

ids = list(set([id['id'] for id in l2]))
random.shuffle(ids)

l3 =[]
for id in ids:
    l3.extend([item for item in l2 if item['id']==id])

根据我的理解,您希望对列表中的项目进行随机播放,但保留类似ID的time值的顺序。

l2 = [ {'id': '02', 'time': 'bl' }, {'id': '02', 'time': 'm24' },  {'id': '05', 'time': 'bl' }, {'id': '05', 'time': 'm12' }, {'id': '05', 'time': 'm24' }, {'id': '09', 'time': 'm12' }]
import random
ids = [id['id'] for id in l2]
random.shuffle(ids)
d = dict()
for id in set(ids):
    d[id] = [item for item in l2 if item['id'] == id]

l3 = []
for id in ids:
    l3.append(d[id].pop(0))

就我而言,它打印出来:

print ids
>>['05', '09', '02', '02', '05', '05']

print l2
>>[{'id': '02', 'time': 'bl'},
   {'id': '02', 'time': 'm24'},
   {'id': '05', 'time': 'bl'},
   {'id': '05', 'time': 'm12'},
   {'id': '05', 'time': 'm24'},
   {'id': '09', 'time': 'm12'}]

print l3
>>[{'id': '05', 'time': 'bl'},
   {'id': '09', 'time': 'm12'},
   {'id': '02', 'time': 'bl'},
   {'id': '02', 'time': 'm24'},
   {'id': '05', 'time': 'm12'},
   {'id': '05', 'time': 'm24'}]

在字典中构建列表时,您还可以使用生成器而不是列表解析:

for id in set(ids):
    d[id] = (c for c in l2 if c['id'] == id)
for id in ids:
    l3.append(next(d[id]))