我有一个以下形式的字典:
{'string1': 3, 'string2': 4, 'string3':2}
我想把它变成一个列表,其中键的实例是其对应值对的函数。像这样:
['string1','string1','string1','string2','string2','string2','string2','string3','string3']
我正在努力解决这个问题,因为我觉得应该有一个优雅的解决方案。这是我到目前为止所做的:
t2 = [dictionary[key]*key for key in dictionary.keys()]
但是会产生以下混乱:
['string2string2string2string2', 'string3string3', 'string1string1string1']
答案 0 :(得分:5)
如果按键顺序不重要,您可以试试这个:
[k for k, v in d.items() for _ in range(v)]
#['string2',
# 'string2',
# 'string2',
# 'string2',
# 'string3',
# 'string3',
# 'string1',
# 'string1',
# 'string1']
答案 1 :(得分:4)
您可以使用collections.Counter()
执行此操作:
>>> list(Counter(d).elements())
['string1', 'string1', 'string1', 'string3', 'string3', 'string2', 'string2', 'string2', 'string2']
当然使用字典时,订单无法保证。
答案 2 :(得分:1)
你唯一搞砸的是你忘了把钥匙放在方括号里,这里:
var str = 'T____';
let i=5;
while(i--){
console.log(i, str=moveLetter(str) );
}
function moveLetter(str){
return str.replace(/^(.*?)([^_])(.)(.*)$/,"$1$3$2$4")
}
结果:
let str = '_T____',
len = str.length;
function moveLetter(str) {
let arr = str.split(''),
pos = str.search(/[^_]/);
// swap array elements
[arr[pos], arr[pos+1]] = [arr[pos+1], arr[pos]];
return arr.join('');
}
while (len--)
console.log(len, str = moveLetter(str));
*编辑*
如果你想要一个扁平版本,那么修改后的代码就是:
dictionary = {'string1': 3, 'string2': 4, 'string3':2}
t2 = [dictionary[key]*[key] for key in dictionary.keys()]
print(t2)
结果:
[['string2', 'string2', 'string2', 'string2'], ['string1', 'string1', 'string1'], ['string3', 'string3']]