【问题标题】:Issue looping through kwarg values python问题循环通过kwarg值python
【发布时间】:2019-12-12 23:26:04
【问题描述】:

我正在尝试使用 kwargs 创建我的第一个函数,但在循环时遇到了一些问题。

我正在传递两个 kwargs:tick 和 start。 tick 和 start 都将是字符串或字符串列表。

我想遍历 kwargs 以使用 if elif 对它们进行分类并包含正确的字符串和 kwarg

当 kwarg 通过测试时,我想获取该 kwarg 的值并将其/它们附加到与其名称列表匹配的列表中(即刻度进入刻度列表)

目前,我正在获取所有 kwargs 值并将它们附加到列表中,而不是我正在处理的 kwarg 值。

kwarg、kwargs 和 kwarg's sorry 之间是有区别的,这令人困惑。

def fn1(**kwargs):
    ticks = []
    start = []

    # Iterating over the Python kwargs dictionary

for kwarg in kwargs: # For each kwarg in kwargs
        if "ticks" in kwarg:   #Test if "tick" in kwarg. If yes continue to line below, if not skip the next two lines
            for kwarg in kwargs.values():  #for each i in kwargs values  THIS IS WRONG
                    ticks.append(kwarg)
                    break  # I use this to fix what is wrong 

        elif "start" in kwarg:
                for kwarg in kwargs.values(): #Same problem as 5 lines up, and now I do not know how to either skip the first iteration of the loop or fix the original problem
                    start.append(kwarg)

    print(ticks, start)

输入:

fn1(ticks= ["IBM", "AAPL"], start= "2")

输出:

[['IBM', 'AAPL']] [['IBM', 'AAPL'], '2']

期望的输出:

[['IBM', 'AAPL']] ['2']

【问题讨论】:

标签: python loops keyword-argument


【解决方案1】:

不确定源代码中的逻辑,但我做了一个可行的解决方案,返回所需的输出。

def fn1(**kwargs):
    ticks = []
    start = []

    for kwarg, values in kwargs.items():  # For every kwarg in kwargs
        if kwarg == "ticks":
            ticks.append(values)

        elif kwarg == "start":
            start.append(values)

    print(ticks, start)


fn1(ticks=["IBM", "AAPL"], start="2")

输出

 # python test123.py
[['IBM', 'AAPL']] ['2']

在输出中,我看到您希望将传递的 kwarg 值添加到数组中,但在源代码中您正在对其进行迭代。不确定您到底在寻找什么,所以我通过获得所需的输出来完成它:)

【讨论】:

    【解决方案2】:

    你的 for 循环太多了。当您使用**kwargs 时,它会创建一个名为kwargs 的字典。

    fn1(ticks= ["IBM", "AAPL"], start= "2")
    

    将创建一个像这样的字典:

    {'ticks': ['IBM', 'AAPL'],
     'start': '2'}
    

    您正在遍历键,然后是每个匹配键的所有值。

    如果你摆脱了外部 for 循环,你可以检查给定的字符串是否在字典中。然后你可以遍历那个键的值。

    def fn1(**kwargs):
        ticks = []
        start = []
    
        if "ticks" in kwargs:
            for kwarg in kwargs['ticks']:
                ticks.append(kwarg)
        elif "start" in kwargs:
            for kwarg in kwargs['start']: 
                start.append(kwarg)
        print('Ticks: {}'.format(ticks))
        print('Start: {}'.format(start))
    

    但鉴于您只是将所有内容附加到字典中,您可能会一起取消循环,而直接使用字典中的值。

    def fn1(**kwargs):
        print('Ticks: {}'.format(kwargs.get('ticks', [])))
        print('Start: {}'.format(kwargs.get('start', [])))
    

    请记住,在您提供的示例结果中,start 是一个列表,但您提供的是一个字符串。如果您希望 start 成为列表,您应该提供 start=['2']

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多