我有一个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
进行了部分排序。
答案 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]))