我有一本字典
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():
我不知道下一步该做什么?
答案 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)
}
应该做的伎俩