【问题标题】:Python create a dict from a list of listsPython从列表列表中创建一个字典
【发布时间】:2015-04-10 08:01:45
【问题描述】:

我正在使用 django 1.8、Python 2.7.5、django-datatables-view 1.2datatables 1.10.6。尝试使用 columndefscolumns.render 时出现以下错误:

警告:请求未知...

我查看了here 上的文档,基本上发现 datatables 不知道我请求什么数据,因为它找不到它。所以我查看了数据是如何返回的:

{
    "recordsTotal": 176,
    "recordsFiltered": 176,
    "draw": 0,
    "data": [
        [
            109,
            "Hostname1",
            "1.1.1.1",
            "Excluded",
            "Down"
        ],
        [
            116,
            "Hostname2",
            "2.2.2.2",
            "Excluded",
            "Up"
        ],
        ...
    ],
    "result": "ok"
}

所以我在使用 PHP 之前使用过数据表,为了使用列 def,您需要一个键:值对,以便您可以定义 "data": "Key",这显然不是。我想我已经缩小了构建准备结果的范围:

def prepare_results(self, qs):
    data = []
    for item in qs:
        data.append([self.render_column(item, column) for column in self.get_columns()])
    return data

我终其一生都无法弄清楚如何将此列表转换为以下列方式返回结果的字典:

{
    "recordsTotal": 176,
    "recordsFiltered": 176,
    "draw": 0,
    "data": [
        {
            "Rest Id": "109",
            "Host Name": "Hostname1",
            "Ip Address": "1.1.1.1",
            "Mode": "Excluded",
            "State": "Down"
        },
        {
            "Rest Id": "116",
            "Host Name": "Hostname2",
            "Ip Address": "2.2.2.2",
            "Mode": "Excluded",
            "State": "Up"
        },
        ...
    ],
    "result": "ok"
}

我知道我可以通过 dict 理解完成我想要做的事情,但我无法找到一种方法来完全按照我希望返回输出的方式来获得它。我还必须相信,有一种比在已经准备好的列表列表上执行 dict 理解更好的方法。任何和所有的帮助将不胜感激。提前谢谢你。

【问题讨论】:

    标签: python list dictionary datatables datatables-1.10


    【解决方案1】:

    假设您的数据在 datas 变量中,您可以执行以下操作:

    keys = ["Rest Id", "Host Name", "Ip Address", "Mode", "State"]
    datas["data"] = [dict(zip(keys, d)) for d in datas["data"]]
    

    【讨论】:

    • 当我尝试在上面添加 perpare_results 函数时,它告诉我global name 'datas' is not defined。当我尝试添加字段列表并返回 [dict(zip(keys, d)) for d in data["data"]] 它告诉我 list indices must be integers, not str
    • 包含您在问题中打印的所有数据的变量是什么?
    • 它应该只是“数据”。请参阅here 第 174 - 240 行是魔法发生的地方,但数据看起来像是在 prepare_results 函数中准备的。
    • 实际上它看起来像 prepare_results 构建了 data 列表,但 get_context_data 将其转储到一个名为 ret 的数组中,这就是返回上面的输出。
    • 所以"data": [ [ 109, "Hostname1", "1.1.1.1", "Excluded", "Down" ], [...]] 是由prepare_results 构建的?
    【解决方案2】:

    我很抱歉,但我通过数据表 javascript 直接解决了我自己的问题,而不是在 python 代码中进行更改:

    "columnDefs": [
        {
            "targets": 0,
            "data": 0,
            "render": function ( data, type, full, meta ) {
                return '<span data-clipboard-text="' + data + '">' + String(data) + '</span>' + 
                '<a href="URLICANNOTSHARE' + data + 
                'MOREOFTHEURLICANNOTSHARE" class="btn btn-info btn-xs" role="button" target="_blank" style="float:right;"><span class="glyphicon glyphicon-search" aria-hidden="true"></span></a>';
                },
        },
        ....
    ],
    

    我也脑补了我上面所说的,我应该说的是,默认情况下数据表 expects 是一个 javascript 对象(至少他们拥有的每个示例都显示正在解析的数据是一个对象)但我返回的是一个 javascript 数组(如果你有半个大脑,仍然可以工作,但我没有)。将保持开放状态,看看是否可以提供 python 解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 2022-06-27
      • 2023-04-08
      • 2020-04-28
      • 2013-10-26
      • 2020-11-17
      相关资源
      最近更新 更多