加入collections.defaultdict在Python 2.5大大降低用于需要dict的setdefault方法.这个问题适合我们的集体教育:
setdefault今天在Python 2.6/2.7中还有什么用处?setdefault被取代了collections.defaultdict?以下两个表达式似乎与我相同.哪个更好?
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虽然对于没有经验的人来说更难掌握,但速度更快,因此更可取.意见?
我知道我想要做的是坏主意,但我现在有特定的约束.
我有多个站点,使用一个相同的MVC3代码库.对于其中一个,要求是从表单中隐藏一些必填字段.
我知道最好的方法是修改控制器来设置这些字段的默认值,但我想实现这个只修改这个特定站点的视图,而不用更改代码.
那么,如何在视图中将特定模型属性设置为默认值?理想应该是这样的:
@Html.HiddenFor(model => model.RequiredProperty)
@model.RequiredProperty = "default"
Run Code Online (Sandbox Code Playgroud)
编辑:更多解释
所以,实际上这是在子视图中,由2个不同的主视图使用.只有在使用一个特定的主视图时才需要设置这些属性,而不是其他主视图.
所以,我想默认设置需要转到特定的"主"视图.看起来我不能在子视图中使用HiddenFor,然后在主视图中使用Html.Hidden.
有没有办法检查子视图哪个是外视图?
我见过其他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
我正在为性能很重要的应用程序编写代码.我想知道为什么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) 我现在正在上在线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(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)
或者,它是否只是打印失序?
为了说明问题,我创建了一个简单的例子:
#!/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)
一次又一次地调用函数.怎么了?
字符串列表:
['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) 我有以下代码片段:
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)
我不确定为什么.有没有人有任何想法?
所以很可能这个问题已经被提出过了.找不到它.
每次我定义一个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)
C++提供这样的功能?我使用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)
我不喜欢分配回地图,因为实际代码更复杂,多次计数增加.但我似乎确实需要这样做.有一个简单的方法吗?
以下字典具有三个级别的键,然后是一个值。
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)
我想创建能够创建必要的嵌套键并避免任何键错误的代码。
我想出的第一个解决方案是:
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() …
setdefault ×13
python ×12
dictionary ×7
defaultdict ×3
c++ ×1
collections ×1
django ×1
for-loop ×1
get ×1
graph ×1
list ×1
model ×1
nested ×1
python-2.7 ×1
razor ×1
stl ×1