python中的dict切片(将perl转换为python)

你好,
让我们进行以下perl代码段:
%myhash =(一个= 1,两个= 2,三= 3);
($ v1,$ v2,$ v3)= @myhash {qw(一两个)}; #< - 兴趣线
打印" $ v1 \ n $ v2 \ n $ v2 \ n";
我如何以类似的紧凑方式翻译第二行
Python?
以下是我尝试的.我只是对更紧凑的东西感兴趣.
mydict = {'一个':1,'两个':2,'三':3}
#第一个想法,但仍然太多了
[v1,v2,v3] = [mydict [k] fork in ['一个','二','二']]
#对于长列表,较宽敞的键入,但计算密集型
#作为拆分可能会在运行时执行而不是编译
时间
[v1,v2,v3] = [mydict [k]对于k中的k中的k中的k中的k中
打印"%s \ n%s \ n%s"%(v1,v2,v3)
感谢任何想法

# 回答1


在2008年9月10日星期三08:28:43 -0700(PDT),Hofer写道:
关于什么:
[1,2,2]
或者,使其与Perl的QW()事物更相似:
[1,2,2]
....但是我认为使用显式列表更具Pythonic.
不是吗? )
- -
问候,
wojtek walczak,http://tosh.pl/gminick/
# 回答2


在9月10日,16:28,Hofer 另一个选项[请注意,我不是说它是首选的,但是它会
似乎更接近您想使用的某些语法.
(1,1,2)
Hth
乔恩.
# 回答3


B写道:
而这样做的目的不是致电mydict.values()是什么?
# 回答4


弗雷德里克·伦德(Fredrik Lundh)写道:
而这样做的目的不是致电mydict.values()是什么?

更有趣吗?或者,如果您想按键进行排序.
# 回答5


霍弗写道:
Python不会像Perl那样紧凑.通常,辉煌的人
考虑该功能.无论如何,第二个Python版本是
与perl代码相比,不合时宜
代码大小增长时恒定字节数.
初始支架一无所获. " v1,v2,v3 ="也一样.
您已经花费并花费更多的时间来发布和阅读
同等的额外计算时间,这将使用任何正常
汇率和计算使用情况.
这是此类事情的标准习语.如果您困扰您,请输入"'一个
两个两个'.split()"进入一个交互式窗口,'眨眼'
['一个','两个','两个'],您可以将其切入并粘贴到程序中.
但是,更多的python程序中约有3个编号变量
提出更好的设计的可能性,例如离开价值
在列表中,VEE并通过索引访问它们.
Terry Jan Reedy
# 回答6


hofer 我在另一个回答中没有看到的一点是,至少对于
给出的示例,您根本不需要第二行:
mydict = {'一个':1,'两个':2,'三':3}
打印"%(一个)s \ n%(两个)s \ n%(两个)s"%mydict
- -
Duncan Booth http://kupuguy.blogspot.com
# 回答7


hofer 作为前珀尔程序员,已经使用Python多年了,
我会键入明确的
v1,v2,v3 = mydict ['一个'],mydi ct ['两个'],mydict ['两个']#54 chars
甚至甚至
v1 = mydict ['一个']#54 chars
v2 = mydict ['两个']
v3 = mydict ['两个']
要么只能输入几个字符.完全
相比
v1,v2,v3 = [mydict [k] fork in ['一个','二','二']]#52 chars
v1,v2,v3 = [mydict [k] for k in'二2'split()]#54 chars
与Perl不同,如果MyDict不包含"一个",它也会炸毁
哪个可能是您想要的也可能不是您想要的.
- -
Nick Craig-Wood
# 回答8


尼克·克雷格·伍德(Nick Craig -Wood)在2008年9月11日在THU上写道:
但这是您使用过的名字的事故.考虑:
v1,v2,v3 = section_heading_to_table_index ['一个'],\
section_heading_to_table_index ['两个'],\
section_heading_to_table_index ['两个']#133个字符
相对:
v1,v2,v3 = [section_heading_to_table_index [k] fork in
['一个','两个','两个']]#75个字符
它也未能使"不要重复自己"原则,并且完全
无法扩展超出少数密钥.
出于兴趣,至少在我的PC上,列表comp版本非常重要
比明确任务慢.因此,这是一个微优化的
如果需要,可能值得考虑 - 但要付出更大的代价
维护代码.
这是有争议的问题.我发现列表理解完美
可读和可理解,实际上我必须阅读您的明确
两次作业以确保我没有错过任何东西.但是我接受
如果您不习惯列出comps,它们看起来可能有些奇怪.
- -
史蒂文
# 回答9


非常感谢您的所有答案.
我学到了很多东西:-)
[V1,V2,V3] = ...
可以键入
v1,v2,v3 =. . .
我也不习惯
地图(myhash.get,['一个','两个','二'])
itemgetter('一个','一个','两个')(x)
我也不知道
打印"%(一个)s \ n%(两个)s \ n%(两个)s"%mydict
我想在上面有简短陈述的原因是,
对我来说基本上只是
我给出的代码中的一些代码,用于命名和使用哈希的某些字段
部分.
真实的例子更像是:
名称,年龄,country = itemgetter('name age country'.split())(x)#或任何
我的上述版本
#使用名称 /年龄 /国家 /地区的许多代码
感谢收获和再见
H
在9月10日,5:28*pm,hofer
# 回答10


在9月11日,10:36*上午,尼克·克雷格·伍德(Nick Craig-Wood) 您的上述解决方案是对未定义键的强大解决方案.
在我的示例中,这不是一个问题.命令将完全
人口稠密,但我很好奇.
# 回答11


霍弗:
该解决方案非常聪明,发明家很聪明,但是也很明智
在正常的真实代码中使用的标准和复杂得多.
学习技巧很有用,但是在实际代码中,您必须使用然后
偶尔只有一段时间.列表comp更容易理解
Python程序员.
再见,
# 回答12


霍弗写道:
哎哟.
如果您这样做很多(=不止一次),只需包装DIC a
简单属性代理,并使用普通属性访问.也就是说
class AttributeWrapper:
def __init __(self,obj):
self.obj = obj
def __getAttr __(self,name):
尝试:
返回self.obj [名称]
除了KeyError:
提高属性(名称)
或者,较短但不太明显,也许有点聪明
开始辉煌的人:
class AttributeWrapper:
def __init __(self,obj):
self .__ dict __.更新(obj)
你可以做
{'country':'se','age':123,'name':'soming name'}
"一些名字"
123
'se'
而且,如果必须,将属性分配给这样的本地变量:
"一些名字"
123
'se'
(迈向真正的Pythonicness的下一步将是将您的数据存储在
首先,课堂实例而不是字典,但一步
一次...)
# 回答13


在9月11日,10:52*AM,Hofer 您的上述解决方案是对未定义键的强大解决方案.
在我的示例中,这不是一个问题.命令将完全
人口稠密,但我很好奇.
如果未定义的密钥不是问题,那么您期望有一个价值
从他们.利用
v1,v2,v3 = [mydict.get(k,默认值)k in'二两个'split()]
默认值是您期望的值.
# 回答14


在9月11日,6:11*PM,Fredrik Lundh [狙击]
当然,这个词是" pythonicity"吗? :-)
# 回答15


Steven d'Aprano 但这是您使用过的名字的事故.考虑:
v1,v2,v3 = section_heading_to_table_index ['一个'],\
section_heading_to_table_index ['两个'],\
section_heading_to_table_index ['两个']#133个字符
相对:
v1,v2,v3 = [section_heading_to_table_index [k] fork in
['一个','两个','两个']]#75个字符
它也未能使"不要重复自己"原则,并且完全
无法扩展超出少数密钥.
如果您有少数密钥,那么您有不同的
我认为您的代码问题(局部变量太多)!
干燥是一个很好的原则.我仍然更喜欢3个明确的作业
尽管 ;-)
这是有争议的问题.我发现列表理解完美
可读和可理解,实际上我必须阅读您的明确
两次作业以确保我没有错过任何东西.但是我接受
如果您不习惯列出comps,它们看起来可能有些奇怪.
肯定有品味!
- -
Nick Craig-Wood

标签: python

添加新评论