首页 > 解决方案 > 多次返回单个变量(不是列表)以从第二个函数起作用?

问题描述

我有第一个无法修改或更改的功能!它显示变量的值(main_index字段不能是列表、元组、字典等。它很简单,只是一个变量,必须保持原样)

该函数触发第二个函数,该函数可以返回多个值,因此想法是以某种方式一个一个地显示这些多个值,但不将它们放入列表或字典中。等等。可以以任何方式更改第二个功能。

代码如下(请注意第一个函数不能以任何方式修改,我这里只是简化一下)。

def not_changeable():
    value_to_check='7.1'
    main_index=generate_index(value_to_check)
    print (main_index)

def generate_index(index):
    dictionary={'7.1.1':{'value':'1'},'7.1.2':{'value':'2'},'7.100.3':{'value':'3'}}
    filtered_dict={}
    concatanatedIndex=index+'.'
    for k in dictionary.keys():
        if concatanatedIndex in k:
            filtered_dict[k]=dictionary[k]
    print (filtered_dict)
    for indx in filtered_dict:
        return (filtered_dict.get(indx).get('value'))

not_changeable()

作为输出,我得到一个值(因为返回函数结束了脚本)

{'7.1.1': {'value': '1'}, '7.1.2': {'value': '2'}}
1

但我想获得价值

1
2

无需对第一个功能进行任何修改。

我知道如果我返回列表,我将能够显示所有值,但是是否可以在不修改第一个函数的情况下显示 1 和 2?

标签: pythonpython-3.xreturn

解决方案


在 for 循环中返回通常不是您想要的,最好在循环中构建数据结构然后稍后返回,或者返回整个数据结构,因为它是在理解中构建的。在这里,您可以返回带有换行符而不是值的字符串,如下所示:

def generate_index(index):
    dictionary={'7.1.1':{'value':'1'},'7.1.2':{'value':'2'},'7.100.3':{'value':'3'}}
    filtered_dict={}
    concatanatedIndex=index+'.'
    for k in dictionary.keys():
        if concatanatedIndex in k:
            filtered_dict[k]=dictionary[k]
    print (filtered_dict)
    return '\n'.join(sorted(filtered_dict.get(indx).get('value') for indx in filtered_dict))

这将打印

{'7.1.2': {'value': '2'}, '7.1.1': {'value': '1'}}
1
2

最后一条语句的细分'\n'.join(sorted(filtered_dict.get(indx).get('value') for indx in filtered_dict))::

  • 我们使用推导来生成我们感兴趣的数据:filtered_dict.get(indx).get('value') for indx in filtered_dict- 这实际上是一个生成推导,但您可以将[]其设为列表推导。
  • 因为我们正在迭代字典,并且字典不能保证按特定顺序排列(尽管我相信这在 Python 3.6 中有所改变),所以我添加了sorted调用以确保12.
  • 要将可迭代(如列表)转换为字符串,我们可以使用 string 方法.join(),该方法通过将列表中的元素连接在一起并将字符串放在每个元素之间来创建字符串。所以'-hello-'.join(['a', 'b', 'c'])会变成'a-hello-b-hello-c'

实际上,构建返回字符串的更简单方法是迭代 dict.values() 而不是实际的 dict。如果我们使用 python 版本 > 3.6,我们可以跳过sorted调用,所以返回简单地变成:return '\n'.join(v.get('value') for v in filtered_dict.values())

但更好的设计可能是返回字典中的值,并在一个单独的函数中以特定格式打印它们,该函数只负责显示。


推荐阅读