python使用if和for函数用于带有列表的字典

时间:2018-03-30 10:37:40

标签: python

你是python的新手,想要解决我目前遇到的这个问题。我最近了解了字典和列表,发现字典的值可以格式化为列表。

面临的问题: 1)如果我使用return v或x,为什么我的函数不起作用?它将返回另一个键的值,例如" zipper"在这种情况下。我想了解为什么它不适用于存储在列表中的值,小吃键的所有值。 如果我输入"糖果"我期待它能让我回报甜食的价值。作为参数中的x。

即如果我在参数中输入糖果作为X,当调用该函数时它将打印出拉链的值(我不知道为什么) 但是,如果我将返回值更改为return(x)它会解决问题,但我只是想了解为什么返回V或X不起作用

bagpack= {
  "pouch":"water bottle",
  "snacks":["chocolate","sweets", "icecream"],
  "front_zip":"zipper"
}

def search_bag(x):
    for k, v in bagpack.iteritems():
        for snack in bagpack["snacks"]:
            if v == x or snack == x:
                return v or x


print(search_bag("chocolate"))

4 个答案:

答案 0 :(得分:0)

以下列方式更新了您的搜索功能:

def search_bag(x):
  for k, v in bagpack.iteritems():
      if x in v:
          return k

基本上,搜索对象或数组中的String并返回密钥 假设:x在值soemwhere中以当前不精确的方式发送

答案 1 :(得分:0)

假设您需要在指定项目的字典中找到所有键,您可以使用以下内容:

bagpack= {
  "pouch":"water bottle",
  "snacks":["chocolate","sweets", "icecream"],
  "front_zip":"zipper"
}

def search_bag(x):
    lst = []
    for k, v in bagpack.iteritems():   # items() in python3
        if isinstance(v, list):
            v = ' '.join(v)
            if x in v:
                lst.append(k)
        else:
            if x == v:
                lst.append(k)
    return lst

print('Found in {}'.format(', '.join(search_bag("chocolate"))))
# Found in snacks

答案 2 :(得分:0)

我认为你想要真或假

bagpack= {
    "pouch":"water bottle",
    "snacks":["chocolate","sweets", "icecream"],
    "front_zip":"zipper"
}

def search_bag(x):
    for k, v in bagpack.iteritems():
        for snack in bagpack["snacks"]:
            if v == x or snack == x:
                return v == x or snack == x
        return False

print("search Result : " + str(search_bag("chocolate")))

<强>结果 搜索结果:True

答案 3 :(得分:0)

调试像这样的一小段代码的第一个也是最简单的解决方案是在函数中的几个点处print()值来找出真正发生的事情:

>>> def search_bag(x):
...     for k, v in bagpack.iteritems():
...         for snack in bagpack["snacks"]:
...             print("x : '{}' - v : '{}' - snack : '{}'".format(x, v, snack))
...             if v == x or snack == x:
...                 print("'{}' or '{}' == '{}'".format(v, x, v or x))
...                 return v or x
>>> search_bag("chocolate")
x : 'chocolate' - v : 'zipper' - snack : 'chocolate'
'zipper' or 'chocolate' == 'zipper'
'zipper'

正如您可以在这里看到的,您的第一个明显问题是您误解了逻辑or运算符的作用。 a or b将首先测试a的真值(bool(a)的结果)。如果它为True,则返回a并在此处停止。否则,它返回b

如果v == x or snack =xv匹配snack,则x表达式将评估为True,如果其中任何一个匹配x,则表达式为False。

然后你返回v or x。由于在Python中非空字符串具有True boolan值,因此表达式"zipper" or "chocolate"将逐渐变为"zipper"。实际上,因为你的dict中没有任何虚假(空字符串,空列表或字典,数字零)值,表达式v or x总是返回v,期。

vsnack实际匹配x中的哪一个v or x表达式的结果绝对没有影响 - 此时,解释的人甚至不知道vsnack匹配x中的哪一个,它所做的就是选择vx中的第一个不是&#34;假&#34;并将其归还。

如果您想知道哪个vsnack匹配并返回适当的值,则必须进行两项不同的测试:

if v == x:
    return v # or you could return `v` as well
elif snack == x:
    return x # or you could return `snack` as well ;)   

现在您的第二个错误是在dict中混合使用不同类型的值(字符串和列表)而正确处理search_bag函数中的这些不同类型。有两个嵌套的for循环,内部的一个是常量的(它会在外循环的每一个循环中一次又一次地迭代相同的值)是完全没有效率的,并且硬编码&#34;零食&#34;关键是充其量的脆弱。

这里有两种可能的解决方案:要么创建所有值列表,要么 - 而不是硬编码某些键 - 测试值的类型并相应地处理它:

解决方案1:

bagpack= {
  "pouch": ["water bottle"],
  "snacks":["chocolate","sweets", "icecream"],
  "front_zip": ["zipper"],
}
def search_bag(x):
    # if you don't need the keys then don't use them
    for values in bagpack.values():
        for v in values:
            if v == x:
                return v

可以使用包容测试进行简化:

def search_bag(x):
    for values in bagpack.values():
        if x in values:
            return x

解决方案2:

bagpack= {
  "pouch": "water bottle",
  "snacks":["chocolate","sweets", "icecream"],
  "front_zip": "zipper",
}
def search_bag(x):
    for value in bagpack.values():
        if isinstance(value, list):
            if x in value:
                return x 
        elif x == value
            return x

因为你的所有功能都是&#34;如果它在dict中的任何地方返回搜索值,否则返回None&#34; - 它的语义主要是&#34;我们有&#39; x&#39;在包#34;中,正确的API就是命名你的功能&#34; is_in_bag(x)&#34;并使其返回布尔值:

解决方案1(bagpack仅包含列表):

def is_in_bag(x):
    return any(x in v for v in bagpack.values())

解决方案2(bagpack包含混合值):

def is_in_bag(x):
    return any(
        x in v if isinstance(v, list) else x == v
        for v in bagpack.values()
        )