标签: setdefault

"setdefault"dict方法的用例

加入collections.defaultdict在Python 2.5大大降低用于需要dictsetdefault方法.这个问题适合我们的集体教育:

  1. setdefault今天在Python 2.6/2.7中还有什么用处?
  2. 哪些流行的用例setdefault被取代了collections.defaultdict

python dictionary setdefault

181
推荐指数
7
解决办法
9万
查看次数

python dict:get vs setdefault

以下两个表达式似乎与我相同.哪个更好?

data = [('a', 1), ('b', 1), ('b', 2)]

d1 = {}
d2 = {}

for key, val in data:
    # variant 1)
    d1[key] = d1.get(key, []) + [val]
    # variant 2)
    d2.setdefault(key, []).append(val)
Run Code Online (Sandbox Code Playgroud)

结果是一样的,但哪个版本更好或更富有pythonic?

就个人而言,我觉得版本2难以理解,因为对我而言,setdefault非常难以掌握.如果我理解正确,它会在字典中查找"key"的值,如果不可用,则在"dict"中输入"[]",返回对值或"[]"的引用,并在其中附加"val"参考.虽然顺利但它至少不是直观的(至少对我而言).

在我看来,版本1更容易理解(如果可用,获取"key"的值,如果没有,获取"[]",然后加入由[val]组成的列表并将结果放在"key"中).但是,虽然更直观地理解,但我担心这个版本的性能会降低,所有这些列表都会创建.另一个缺点是"d1"在表达式中出现两次,这是相当容易出错的.可能有一个更好的实现使用get,但目前它没有我.

我的猜测是版本2虽然对于没有经验的人来说更难掌握,但速度更快,因此更可取.意见?

python dictionary get setdefault

46
推荐指数
5
解决办法
4万
查看次数

如何在Razor中设置隐藏值

我知道我想要做的是坏主意,但我现在有特定的约束.

我有多个站点,使用一个相同的MVC3代码库.对于其中一个,要求是从表单中隐藏一些必填字段.

我知道最好的方法是修改控制器来设置这些字段的默认值,但我想实现这个只修改这个特定站点的视图,而不用更改代码.

那么,如何在视图中将特定模型属性设置为默认值?理想应该是这样的:

@Html.HiddenFor(model => model.RequiredProperty)
@model.RequiredProperty = "default"
Run Code Online (Sandbox Code Playgroud)

编辑:更多解释

所以,实际上这是在子视图中,由2个不同的主视图使用.只有在使用一个特定的主视图时才需要设置这些属性,而不是其他主视图.

所以,我想默认设置需要转到特定的"主"视图.看起来我不能在子视图中使用HiddenFor,然后在主视图中使用Html.Hidden.

有没有办法检查子视图哪个是外视图?

model-view-controller model razor setdefault asp.net-mvc-3

36
推荐指数
3
解决办法
14万
查看次数

Python的集合模块中的defaultdict是否真的比使用setdefault快?

我见过其他Python程序员使用collections模块中的defaultdict来实现以下用例:

from collections import defaultdict

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]

def main():
    d = defaultdict(list)
    for k, v in s:
        d[k].append(v)
Run Code Online (Sandbox Code Playgroud)

我通常使用setdefault来解决这个问题:

def main():
    d = {}
    for k, v in s:
        d.setdefault(k, []).append(v)
Run Code Online (Sandbox Code Playgroud)

文档实际上声称使用defaultdict更快,但我在测试自己时看到了相反的情况:

$ python -mtimeit -s "from withsetdefault import main; s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)];" "main()"
100000 loops, best of 3: 4.51 usec per loop
$ python -mtimeit -s "from withdefaultdict …
Run Code Online (Sandbox Code Playgroud)

python collections setdefault defaultdict python-collections

17
推荐指数
1
解决办法
5930
查看次数

setdefault vs defaultdict performance

我正在为性能很重要的应用程序编写代码.我想知道为什么defaultdict似乎更快setdefault.

我希望能够使用setdefault,主要是因为我不喜欢嵌套的打印输出defaultdict(参见下面的实现).

在我的代码中,我需要测试是否element_id已经是dict的关键.

以下是我正在测试的两个函数:

def defaultdictfunc(subcases,other_ids,element_ids):
    dict_name= defaultdict(lambda: defaultdict(lambda: defaultdict(dict)))
    for subcase in subcases:
        for other_id in other_ids:
            for element_id in element_ids: 
                if element_id in dict_name[subcase][other_id]:
                    # error duplicate element_id
                    pass
                else:
                    dict_name[subcase][other_id][element_id]=0
    return dict_name

def setdefaultfunc(subcases,other_ids,element_ids):
    dict_name={}
    for subcase in subcases:
        for other_id in other_ids:
            for element_id in element_ids: 
                if element_id in dict_name.setdefault(subcase,{}).setdefault(other_id,{}):
                    # error duplicate element_id
                    pass
                else:
                    dict_name[subcase][other_id][element_id]=0

    return dict_name
Run Code Online (Sandbox Code Playgroud)

IPython输入输出:

In [1]: from numpy.random import randint …
Run Code Online (Sandbox Code Playgroud)

python dictionary setdefault defaultdict

10
推荐指数
1
解决办法
2320
查看次数

Python Django-os.environ.setdefault('DJANGO_SETTINGS_MODULE','folder.settings')是做什么的?

我现在正在上在线Django课程,并且我不理解某些配置代码。我的教练说,在填充我的数据库的python代码中,需要以下代码。

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ProTwo.settings')

import django
django.setup()
Run Code Online (Sandbox Code Playgroud)

我根本不理解这些代码在做什么,除了其中的第二个参数setdefault()是指我的应用程序的settings.py文件。

什么DJANGO_SETTINGS_MODULE啊 它有什么作用?为什么将其作为arg传入setdefault()

怎么django.setup()办?它会发生什么变化?

请了解,我几乎是新手,也不懂很多行话。

python django setdefault

9
推荐指数
1
解决办法
3714
查看次数

为什么这个python字典是使用setdefault()无序创建的?

我刚开始玩Python(VBA背景).为什么这本字典无序创建?不应该是:1,b:2 ......等等?

class Card:
def county(self):
    c = 0
    l = 0
    groupL = {}  # groupL for Loop
    for n in range(0,13):
        c += 1
        l = chr(n+97)
        groupL.setdefault(l,c)
    return groupL

pick_card = Card()
group = pick_card.county()
print group
Run Code Online (Sandbox Code Playgroud)

这是输出:

{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8, 'k': 11, 'j': 10, 'm': 13, 'l': 12}
Run Code Online (Sandbox Code Playgroud)

或者,它是否只是打印失序?

python dictionary for-loop setdefault

7
推荐指数
1
解决办法
1万
查看次数

为什么setdefault在设置密钥时会评估默认值?

为了说明问题,我创建了一个简单的例子:

#!/usr/bin/env python

class Person():
    def __init__(self):
        self.cache = {}

    def get_person_age(self):
        def get_age():
            print "Calculating age..."
            return self.age
        print self.cache
        return self.cache.setdefault(self.name, get_age())

    def set_person(self, name, age):
        self.name = name
        self.age = age


p = Person()
p.set_person('andrei', 12)

for k in range(0, 5):
    p.get_person_age()
Run Code Online (Sandbox Code Playgroud)

我希望一旦设置了缓存,就不会再次调用函数get_person_age,但事实并非如此:

$ python cache_test.py 
{}
Calculating age...
{'andrei': 12}
Calculating age...
{'andrei': 12}
Calculating age...
{'andrei': 12}
Calculating age...
{'andrei': 12}
Calculating age...
Run Code Online (Sandbox Code Playgroud)

一次又一次地调用函数.怎么了?

python setdefault

5
推荐指数
1
解决办法
279
查看次数

如何从列表列表创建字典键?

字符串列表:

['Georgie Porgie', 87, '$$$', ['Canadian', 'Pub Food'], 'Queen St. Cafe', 82, '$', ['Malaysian', 'Thai'], 'Dumplings R Us', 71, '$', 'Chinese', 'Mexican Grill', 85, '$$', 'Mexican', 'Deep Fried Everything', 52, '$', 'Pub Food']
Run Code Online (Sandbox Code Playgroud)

我正在尝试从上面的列表中创建一个cuine_to_names 字典。菜系在索引 3 处,有时是它们自己的迷你清单。餐厅名称在索引 0 处。它们每四个索引重复一次。美食 - 3::4,名称 - 0::4。

我遇到的问题是从索引 3::4 中提取元素并将它们设为键。我认为麻烦来了,因为有时它们是一个字符串的迷你列表,有时它们只是一个字符串。这使得使用 defaultdict 对我来说很困难,但我是学习该功能的新手。我看到其他一些答案包括 setdefault 之类的东西,但我不知道如何在这种特定情况下使用它。任何指导将不胜感激!

我想要这个输出:

Cuisine to list of restaurant names:
# dict of {str, list of str}
{'Canadian': ['Georgie Porgie'],
 'Pub Food': ['Georgie Porgie', 'Deep Fried Everything'],
 'Malaysian': ['Queen St. Cafe'],
 'Thai': ['Queen …
Run Code Online (Sandbox Code Playgroud)

python dictionary list setdefault defaultdict

3
推荐指数
1
解决办法
40
查看次数

setdefault()不带关键字参数

我有以下代码片段:

mirna2age = {}
for i in agesdb:
    mirna2age.setdefault(i[0],default=[]).append(i[1])
Run Code Online (Sandbox Code Playgroud)

但是,Python返回

TypeError: setdefault() takes no keyword arguments
Run Code Online (Sandbox Code Playgroud)

我不确定为什么.有没有人有任何想法?

python python-2.7 setdefault

2
推荐指数
1
解决办法
2803
查看次数

Python的setdefault的C++(STL map)等效方法

所以很可能这个问题已经被提出过了.找不到它.

每次我定义一个std :: map并想要为它插入一些值时,我都会使用这段代码:

using IntVector = vector < int > ;
map<int, IntVector> mapTmp;

int iKey = 7;
int iVal = 9;
if (mapTmp.find(iKey) == mapTmp.end())
    mapTmp.insert(pair<int, IntVector>(iKey, IntVector()));
mapTmp[iKey].push_back(iKey);
Run Code Online (Sandbox Code Playgroud)

让我恼火的是3条线:

if (mapTmp.find(iKey) == mapTmp.end())
    mapTmp.insert(pair<int, IntVector>(iKey, IntVector()));
mapTmp[iKey].push_back(iVal);
Run Code Online (Sandbox Code Playgroud)

Python提供了一个非常有用的dict函数,名为:setdefault,它基本上将这3行组合成一条漂亮的行.假设我想用C++编写它,它将是:

mapTmp.setdefault(iKey, IntVector()).push_back(iVal);
Run Code Online (Sandbox Code Playgroud)

问题

  1. 是否C++提供这样的功能?
  2. 如果不是,每个人都会一直写下这3行吗?

c++ python dictionary stl setdefault

2
推荐指数
1
解决办法
687
查看次数

使用setdefault,但不想重新分配回map/dict

我使用setdefault计算这样的实例(这是条带版本):

user_to_count_map = {}
for username in list_of_usernames:
    x = user_to_count_map.setdefault(username, 0)
    x += 1
    user_to_count_map[username] = x + 1
for username in sorted(usernmae_to_count_map):
    print username, user_to_count_map[username]
Run Code Online (Sandbox Code Playgroud)

我不喜欢分配回地图,因为实际代码更复杂,多次计数增加.但我似乎确实需要这样做.有一个简单的方法吗?

python setdefault

1
推荐指数
1
解决办法
149
查看次数

避免在嵌套字典中存储值的关键错误 (Python)

介绍

以下字典具有三个级别的键,然后是一个值。

d = {
    1:{
        'A':{
            'i': 100,
            'ii': 200
            }, 
        'B':{
            'i': 300
            }
        }, 
    2:{
        'A':{
            'ii': 500
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

需要补充的例子。

d[1]['B']['ii'] = 600      # OK
d[2]['C']['iii'] = 700     # Keyerror on 'C'
d[3]['D']['iv'] = 800      # Keyerror on 3
Run Code Online (Sandbox Code Playgroud)

问题陈述

我想创建能够创建必要的嵌套键并避免任何键错误的代码。

解决方案1

我想出的第一个解决方案是:

def NewEntry_1(d, lv1, lv2, lv3, value):
    if lv1 in d:
        if lv2 in d:
            d[lv1][lv2][lv3] = value
        else:
            d[lv1][lv2] = {lv3: value}
    else:
        d[lv1] = {lv2: {lv3: value}}
Run Code Online (Sandbox Code Playgroud)

看起来是合法的,但是按照代码段的顺序嵌入它让它变得令人难以置信。我探索了 Stackoverflow 的其他解决方案,并阅读了 get() …

python dictionary nested graph setdefault

1
推荐指数
1
解决办法
2232
查看次数