大多数pythonic方式初始化一个字典

时间:2016-12-18 06:40:49

标签: python dictionary

假设我有这样的词典

    <script>
      <?php
        
        $query = "SELECT date,temperature from tb_temperature where date >= CAST(CURRENT_TIMESTAMP AS DATE)";

        $date = []; // Array to hold our date values
        $series = []; // Array to hold our series values

       $mysqli = new mysqli($host, $usernm, $passwd, $dbname, $port);
        if($mysqli->connect_error) {
          die('Connect Error (' . $mysqli->connect_errno . ')' . $mysqli->connect_error);
        }
        if ($result = $mysqli->query($query)) {
          while( $row = $result->fetch_array(MYSQLI_NUM)){

            array_push($date, $row[0]);
            array_push($series, $row[1]);
          }

    
          foreach ($date as &$value){
            $value = strtotime( $value ) * 1000;
          }

   
          $result->close();
        }
      ?>
   
      var dateValues = [<?php echo join($date, ',') ?>];
      var seriesValues = [<?php echo join($series, ',') ?>];
      <?php

        $mysqli->close(); 
      
      ?>
    </script>
    

它可以由

构建
d = {
    1: [1,4,7],
    2: [2,5,8],
    0: [3,6,9]       
}

我使用此行d = {} for i in range(1,10): key = i % 3 if key not in d: d[key] = [] d[key].append(i) 来检查dict中键/值对的存在并启动该对。

有更多的pythonic方式来实现这个目标吗?

5 个答案:

答案 0 :(得分:3)

这可能最好用defaultdict处理,它会自动创建任何键值映射,如果它不存在则会被访问。您将callable传递给将用于初始化值的""构造函数。例如:

defaultdict

答案 1 :(得分:1)

使用理解:

>>> {n%3: list(range(n, n+7, 3)) for n in range(1,4)}
{0: [3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}

使用dict.setdefault()

>>> d = {}
>>> for i in range(1, 10):
...     d.setdefault(i%3, []).append(i)
... 
>>> d
{0: [3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}

使用defaultdict

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for i in range(1, 10):
...     d[i%3].append(i)
... 
>>> d
defaultdict(<class 'list'>, {0: [3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]})

答案 2 :(得分:0)

您可以使用列表切片[start:stop:step] nominclature

    token: {
        type: GraphQLString,
        resolve: ({token}) => token
    }
},
mutateAndGetPayload: (credentials) => {
    return UserProf.findOne({ email: credentials.email }).then((r) => {
        if (!r) {
            return new Error('no user');
        } else if (r) {
            if (r.password != credentials.password) {
                return new Error('password error');
            } else {
                return { token: jwt.getToken(r) };
            }
        }
    });
}

答案 3 :(得分:0)

from collections import defaultdict

d = defaultdict(list)
for i in range(1,10):
    key = i % 3
    d[key].append(i)
print(d)

出:

defaultdict(<class 'list'>, {0: [3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]})
  

第一次遇到每个密钥时,它还没有进入   映射;所以使用。自动创建一个条目   default_factory函数,返回一个空列表。该   然后list.append()操作将值附加到新列表。什么时候   再次遇到键,查找正常进行(返回   该键的列表)和list.append()操作添加另一个   值列表。这种技术比一种技术更简单,更快捷   使用dict.setdefault()的等效技术:

>>> d = {}
>>> for k, v in s:  
        d.setdefault(k, []).append(v)

答案 4 :(得分:0)

鉴于您没有给出任何输入或可变部分,您可能只是用您已有的文字初始化它:

d = {1: [1,4,7],
     2: [2,5,8],
     0: [3,6,9]}

如果您有变量输入,则可以将collections.defaultdictlist一起用作工厂。鉴于此操作非常常见,因此几个外部库具有以下功能:

例如:

>>> from iteration_utilities import groupedby

>>> groupedby(range(1, 10), lambda x: x % 3)
{0: [3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}

或:

>>> from toolz import groupby

>>> groupby(lambda x: x % 3, range(1, 10))
{0: [3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}