如何将python字典转换为具有故意重复值的列表

时间:2017-03-12 01:40:29

标签: python dictionary

我有一个以下形式的字典:

{'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']

3 个答案:

答案 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']]