如何使用字典中的重复键生成列表?

时间:2018-04-23 21:19:22

标签: python python-3.x list

我有一本字典

a_dict = {1: 1, 4: 2, 5: 3, 6: 4}

我想创建一个列表,使得dict键出现值次数:

a_list = [1, 4, 4, 5, 5, 5, 6, 6, 6, 6]  

我目前的代码是这样的:

a_list = []

for key in a_dict.keys():
    for value in a_dict.values():

我不知道下一步该做什么?

5 个答案:

答案 0 :(得分:2)

这个怎么样?

a={1: 1, 4: 2, 5: 3, 6: 4}
list=[]
for key, value in a.items():
    list.extend([key] * value)
print list

答案 1 :(得分:2)

一个相当丑陋的列表理解:

[vals for tuplei in d.items() for vals in [tuplei[0]] * tuplei[1]]

产量

[1, 4, 4, 5, 5, 5, 6, 6, 6, 6]

稍微更具可读性(导致相同的输出):

[vals for (keyi, vali) in d.items() for vals in [keyi] * vali]

一个itertools解决方案:

import itertools

list(itertools.chain.from_iterable([[k]*v for k, v in d.items()]))

也会给出

[1, 4, 4, 5, 5, 5, 6, 6, 6, 6]

简短说明:

[[k]*v for k, v in d.items()]

创建

[[1], [4, 4], [5, 5, 5], [6, 6, 6, 6]]

然后变平。

答案 2 :(得分:2)

这可以使用带有嵌套for循环的列表推导以简洁的方式完成:

>>> d = {1: 1, 4: 2, 5: 3, 6: 4}
>>> [k for k, v in d.items() for _ in range(v)]
[1, 4, 4, 5, 5, 5, 6, 6, 6, 6]

但请注意, dict是无序数据结构,因此结果列表中的键顺序是任意的。

请问您想使用结果列表的目的是什么?也许有更好的方法来解决实际问题。

答案 3 :(得分:1)

你不是在捣乱!

a_dict = {1: 1, 4: 2, 5: 3, 6: 4}
a_list = []
for key, value in a_dict.items():
    a_list.extend([key]*value)
print(a_list)

答案 4 :(得分:0)

var googleSearch = function (restaurants, cb) {
  console.log("google starts");
  const apiKey = google_apiKey;
  const cseKey = cseID;

  return Promise.all(Array.from(restaurants).map(function (restaurant) {

    var keyWord = restaurant.name + " " + restaurant.location.city
      + " " + restaurant.location.state + " food";

    var googleURL = "https://www.googleapis.com/customsearch/v1?key=" + apiKey +
      "&q=" + keyWord +
      "&searchType=image" +
      "&cx=" + cseKey +
      "&num=7" +
      "&safe=medium"
      ;

    return request
      .get(googleURL,
        {
          json: true, headers: {
            'User-Agent': 'thaorell'
          }
        }
      )
      .then(function (response) {
        restaurant.imageURLs = Array.from(response.items).map(function (item) {
          return item.link;
        });
        return restaurant;
      })
    })
  )
    .then(restaurants2 => cb(null, restaurants2))
    .catch(cb)
}

应该做的伎俩