Python:了解循环

时间:2013-08-24 14:02:03

标签: python loops dictionary

我是Python的新手,我认为这不是我的语法问题,但是我的理解......(我确信有一种更简单的方法可以做到这一点,但是现在我真的只是想要对我对循环的理解有什么问题需要一些帮助

考虑一些大致类似的代码......

for k, v in dict1.iteritems():
    if v not in dict2.keys():
        print "adding %s to dict2" % v
        dict2[v] = "whatever"

我的循环遍历dict1中每个键的“if”,我可以告诉因为print语句。好像for循环每次使用dict2的原始定义,并且不考虑最后一次迭代中发生的任何事情。

我曾经预料到,一旦我通过for循环一次,使用dict1中的唯一值,dict1中的任何重复值都会跳过循环的if步骤,因为该值已在前一次迭代中添加到dict2。这是不正确的吗?

非常感谢!

更多背景:嗨,这是我实际拥有的东西(我写过的第一件事,如果你批评整件事情,也许对我有帮助!)我有一个文件列出员工和他们指定的“工作单位“(如果有帮助的话,用”工作单位“代替”团队“),我想到了如何将其导入字典。现在我想将其转换为“工作单位”字典作为键,并将相关员工作为值。现在,无论哪个员工,我只想弄清楚如何获得每个工作单元包含1个密钥的字典。我到目前为止......

sheet = workbook.sheet_by_index(0)
r = sheet.nrows
i = 1
employees = {}

'''Importing employees into a employees dictionary'''
while i < r:
    hrid = sheet.row_values(i,0,1)
    name = sheet.row_values(i,1,2)
    wuid = sheet.row_values(i,2,3)
    wuname = sheet.row_values(i,3,4)
    wum = sheet.row_values(i,4,5)
    parentwuid = sheet.row_values(i,5,6)
    employees[str(i)] = hrid, name, wuid, wuname, wum, parentwuid
    i += 1

'''here's where I create workunits dictionary and try to begin to populate''' 
workunits = {}

for k, v in employees.iteritems():
        if v[2] not in workunits.keys():
            print "Adding to %s to the dictionary" % (v[2])
            workunits[str(v[2])] = v[1]

解决方案:好的,终于到了那里......这只是因为我在if语句中没有在v [2]上调用str()。谢谢大家!

3 个答案:

答案 0 :(得分:1)

您正在检查d v(一个值)是否在dict2的键中,但随后将其添加为键。那是你想要的吗?

如果您打算复制元素可能就是您想要做的事情:

if k not in dict2.keys():
    print "adding %s to dict2" % v
    dict2[k] = v

答案 1 :(得分:0)

你在评论中提到&#34;我想dict2为dict1&#34;中的每个唯一值包含一个键。

有一个紧凑的语法来获得你想要的结果。

d_1 = {1: 2, 3: 4, 5: 6}
d_2 = {v: "whatever" for v in d_1.itervalues()}

但是,这并不能解决您对重复问题的担忧。

您可以做的是在d_1中创建set个值(无重复项),然后从中创建d_2:

values_1 = set(d_1.itervalues())
d_2 = {v: "whatever" for v in values_1}

另一种选择是使用fromkeys方法,但在我看来,这并不像字典理解那样清晰。

d_2 = {}.fromkeys(set(d_1.itervalues()))

除非您有理由相信处理重复文件会让您的代码无法接受,否则我会说您应该使用最直接的方法来表达您想要的内容。

对于将employee_to_team字典转换为team_to_employee字典的应用程序,您可以这样做:

team_to_employee = {v: k for k, v in employee_to_team.iteritems()}

这是因为您不关心代表哪个员工,并且每次遇到重复时此方法都会覆盖。

答案 2 :(得分:0)

这个问题更多的是代码审查,而不是SO,但

for k, v in dict1.iteritems(): # here's you iterating through tuples like (key, value) from dict1
    if v not in dict2.keys():  # list of dict2 keys created each time and you iterating through the whole list trying to find v
        print "adding %s to dict2" % v
        dict2[v] = "whatever"

您可以简化(并提高性能)代码,例如

for k, v in dict1.iteritems(): # here's you iterating through tuples like (key, value) from dict1
    if v not in dict2:         # just check if v is already in dict2
        print "adding %s to dict2" % v
        dict2[v] = "whatever"

甚至

dict2 = {v:"whatever" for v in dict1.values()}