首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从嵌套的dict键值对创建包含项的列表。

从嵌套的dict键值对创建包含项的列表。
EN

Stack Overflow用户
提问于 2018-10-06 10:44:33
回答 2查看 94关注 0票数 0

我想创建一个新列表,其中包含一个大型嵌套dict中的项。

下面是嵌套dict的一个片段:

AcceptedAnswersPython_combined.json

代码语言:javascript
复制
{
  "items": [
    {
      "answers": [
        {
          "creation_date": 1533083368,
          "is_accepted": false
        },
        {
          "creation_date": 1533083567,
          "is_accepted": false
        },
        {
          "creation_date": 1533083754,
          "is_accepted": true
        },
        {
          "creation_date": 1533084669,
          "is_accepted": false
        },
        {
          "creation_date": 1533089107,
          "is_accepted": false
        }
      ],
      "creation_date": 1533083248,
      "tags": [
        "python",
        "pandas",
        "dataframe"
      ]
    },
    {
      "answers": [
        {
          "creation_date": 1533084137,
          "is_accepted": true
        }
      ],
      "creation_date": 1533083367,
      "tags": [
        "python",
        "binary-search-tree"
      ]
    }
  ]
} 

新的列表应该包含每个项目的creation_date,就像在answers列表中有切块一样多。因此,如果出现上面的代码片段,新列表应该如下所示:

代码语言:javascript
复制
question_date_per_answer = [[1533083248, 1533083248, 1533083248 , 1533083248, 1533083248], [1533083367]]

我需要这个新列表的原因是,我想确定每个answers creation_date与其相关的问题creation_date(在items dict中说明)之间的差异。

这张新的熊猫名单应该是这样的:

代码语言:javascript
复制
     question creation date answer creation date  
0          1533083248             1533083368               
1          1533083248             1533083567               
2          1533083248             1533083754                
3          1533083248             1533084669               
4          1533083248             1533089107               
5          1533083367             1533084137

我可以像这样反复回答所有的问题:

代码语言:javascript
复制
items = json.load(open('AcceptedAnswersPython_combined.json'))['items']
question_creation_date = [item['creation_date'] for item in items]

但这给我留下了一个列表,它不等于answers creation_date的数量。

我不能把头绕着这件事。

那么,我如何创建这样一个列表,其中问题创建日期的数量等于答案创建日期的数量?(如question_date_per_answer)

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-06 11:18:46

您需要对项“答案”进行迭代,然后在oreder中为每个答案获取creation_date,以获得答案创建日期。

代码语言:javascript
复制
my_json = """{
"items": [
    {
    "answers": [
        {
        "creation_date": 1533083368,
        "is_accepted": false
        },
        {
        "creation_date": 1533083567,
        "is_accepted": false
        },
        {
        "creation_date": 1533083754,
        "is_accepted": true
        },
        {
        "creation_date": 1533084669,
        "is_accepted": false
        },
        {
        "creation_date": 1533089107,
        "is_accepted": false
        }
    ],
    "creation_date": 1533083248,
    "tags": [
        "python",
        "pandas",
        "dataframe"
    ]
    },
    {
    "answers": [
        {
        "creation_date": 1533084137,
        "is_accepted": true
        }
    ],
    "creation_date": 1533083367,
    "tags": [
        "python",
        "binary-search-tree"
    ]
    }
]
}"""

import json

data = json.loads(my_json)
dates = [(question["creation_date"], answer["creation_date"])
         for question in data["items"] for answer in question["answers"]]
print(dates)
票数 0
EN

Stack Overflow用户

发布于 2018-10-06 11:28:09

您仍然可以使用手头的列表。

让我们试着从你已经拥有的列表中做一个数据-

代码语言:javascript
复制
l = [[1533083248, 1533083248, 1533083248 , 1533083248, 1533083248], [1533083367]]
df = pd.DataFrame(l)

不幸的是你得到了以下-

代码语言:javascript
复制
0   1   2   3   4
0   1533083248  1.533083e+09    1.533083e+09    1.533083e+09    1.533083e+09
1   1533083367  NaN     NaN     NaN     NaN

所以我们得把它转过来。为此,让我们做以下几件事-

代码语言:javascript
复制
from itertools import zip_longest
k = list(list(zip_longest(*l))) #Unless the list will be truncated to the length of shortest list.
df = pd.DataFrame(k)

产出-

代码语言:javascript
复制
0   1
0   1533083248  1.533083e+09
1   1533083248  NaN
2   1533083248  NaN
3   1533083248  NaN
4   1533083248  NaN

现在,我们将使用前面的值by - df.fillna(method='ffill')来填充NaNs。

整个片段-

代码语言:javascript
复制
from itertools import zip_longest
l=[1533083248, 1533083248, 1533083248 , 1533083248, 1533083248], [1533083367]
k=list(list(zip_longest(*l)))
df = pd.DataFrame(k)
df.fillna(method='ffill')

瞧-

代码语言:javascript
复制
    0   1
0   1533083248  1.533083e+09
1   1533083248  1.533083e+09
2   1533083248  1.533083e+09
3   1533083248  1.533083e+09
4   1533083248  1.533083e+09
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52678242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档