2

我是 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 的原始定义,并且不考虑上次迭代中发生的任何事情。

我曾预计,一旦我使用 dict1 中的唯一值通过 for 循环一次,来自 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()。谢谢大家!

4

3 回答 3

1

您正在检查v(a value) 是否在 dict2 的键中,然后将其添加为键。那是你想要它做的吗?

如果您可能打算在此复制元素,则可能是您打算做的事情:

if k not in dict2.keys():
    print "adding %s to dict2" % v
    dict2[k] = v
于 2013-08-24T14:04:18.430 回答
0

您在评论中提到“我希望 dict2 包含 dict1 中每个唯一值的键”。

有一个紧凑的语法可以得到你想要的结果。

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

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

您可以做的是制作setd_1 中的值(无重复),然后从中创建 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()}

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

于 2013-08-24T14:20:36.187 回答
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()}
于 2013-08-24T14:21:32.637 回答