我有两个与内容相关的词典。一个是由以 'shopid' 作为键并以 'userid'的数据集形成的> 作为值。另一个字典是由相同的数据集构成的,但是使用 '用户ID' 作为键和 'datetime ' 此用户作为值购买的商品。
我想做的是创建一个for循环(或类似的循环),对于每个“ shopid”键,它都采用“ userid”值,并将这些“ userid”值转换为包含“第二个字典中的datetime”值。这是用于大型数据集。
我了解字典对您的操作有一些限制,因此,很高兴知道这是否可能或是否有更好的方法来获得类似的结果?
以输入/输出理想为例:
dict1 = {'shopid1':['userid1','userid2','userid3']}
dict2 = {
'userid1':['2020-08-17 09:00','2020-08-18 08:30'],
'userid2':['2020-08-16 11:00','2020-08-15 13:30'],
'userid3':['2020-08-18 09:30','2020-08-18 10:00','2020-08-18 11:30']
}
combined_dict = {
'shopid1':{
'userid1':['2020-08-17 09:00','2020-08-18 08:30'],
'userid2':['2020-08-16 11:00','2020-08-15 13:30'],
'userid3':['2020-08-18 09:30','2020-08-18 10:00','2020-08-18 11:30']
}
}
编辑:
我要合并的实际词典如下:
shopid = {10159: [[[62775725, 214988798, 214988798, 214988798, 62775725,
62775725]]]
userid = {166840413: [[datetime.datetime(2019, 12, 29, 15, 48),
datetime.datetime(2019, 12, 29, 15, 48), datetime.datetime(2019, 12, 29,
15, 48)]]
我相信多余的方括号是几次使用默认字典来创建新的简短字典的产物,这些字典删除了不满足问题要求的值。
答案 0 :(得分:1)
您可以通过dict理解做到这一点:
combined_dict = {i: {j: dict2[j] for j in dict1[i]} for i in dict1}
输出:
>>> from pprint import pprint as pp
>>> pp(combined_dict)
{'shopid1': {'userid1': ['2020-08-17 09:00', '2020-08-18 08:30'],
'userid2': ['2020-08-16 11:00', '2020-08-15 13:30'],
'userid3': ['2020-08-18 09:30',
'2020-08-18 10:00',
'2020-08-18 11:30']}}
答案 1 :(得分:0)
这对于“理解”是一个很好的例子,该“优化”比循环要快得多:
combined_dict = { k:
{u:t for (u,t) in dict2.items() if u in v}
for (k,v) in dict1.items()
}
有关详细信息,请参见此处:https://www.python.org/dev/peps/pep-0274/
答案 2 :(得分:0)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour{
public float speed;
private Rigidbody2D rb;
private Vector2 moveVelocity;
void Start(){
rb = GetComponent<Rigidbody2D>();
}
void Update(){
Vector2.moveInput = new Vector2(Input.GetAxis("Horizontal"),Input.GetAxis("Vertical"));
moveVelocity = moveInput.normalized * speed;
}
void FixedUpdate(){
rb.MovePosition(rb.position + moveVelocity * Time.fixedDeltaTime);
}
}