如果声明混乱

时间:2013-05-15 15:32:42

标签: python

我有一个类似下面的功能。我尝试做的就是说我有checklist('sky high'),然后输出产品将是30,19而不是0,30,0,19,就像我现在的代码所做的那样。如果我有checklist('blue sky'),则输出结果将为0。那么我该如何改变我的代码?

def checklist(argument):

    data = [["sky",'79'],
            ["sky high",'30'],
            ["sky sky",'50'],
            ["sky high",'19']]

    for row in data:
        if argument == row[0]:
           print row[1]

        else:
           print 0

5 个答案:

答案 0 :(得分:3)

def checklist(argument):
    data = [["sky",'79'],
            ["sky high",'30'],
            ["sky sky",'50'],
            ["sky high",'19']]
    #create the list first
    ans = [x[1] for x in data if x[0]==argument]
    #If the list has 0 items then return 0 else return the str.join() version of list
    return ", ".join(ans) if ans else 0

print checklist('sky high')
print checklist('blue sky')

<强>输出:

30, 19
0

答案 1 :(得分:0)

为什么不保留boolean,以防没有符合您输入的行,并在最后检查boolean?这将避免打印这么多0。

答案 2 :(得分:0)

你得到额外的0行,因为每次项目不匹配时你在循环内print 0。为了避免这种情况并使代码更清晰,我将使用稍微不同的数据结构(字典而不是列表列表)。像这样:

def checklist(argument):
    data = {
            "sky":['79'],
            "sky high":['30', '19'],
            "sky sky":['50']
            }
    results = data.get(argument)
    if results is None:
        print 0
    else:
        print('\n'.join(results))

checklist('sblue sky') # prints 0
checklist('sky high') # prints 30\n19

答案 3 :(得分:0)

如果当前元素不是else,那么0语句会导致循环打印argument,这种情况发生了很多。

您必须制作单独的列表并在循环外检查:

results = []

for row in data:
    if argument == row[0]:
        results.append(row[1])

if results:
    print ','.join(results)
else:
    print 0

或者从你的元素中创建一个字典:

data_dict = {}

for key, value in data:
    if key in data_dict:
        data_dict[key].append(value)
    else:
        data_dict[key] = [value]

现在,您可以这样做:

key = 'sky high'

if key in data_dict:
    print ','.join(data_dict[key])
else:
    print 0

或者更简洁:

print ','.join(data_dict.get(key, ['0']))

答案 4 :(得分:0)

如果argument不等于row[0],您似乎不希望发生任何事情,所以只需删除else语句即可。没有必要指定else

def checklist(argument):

    data = [["sky",'79'],
            ["sky high",'30'],
            ["sky sky",'50'],
            ["sky high",'19']]

    for row in data:
        if argument == row[0]:
            print row[1]

我误解了......现在我知道如果从来没有匹配你想要零。你可以试试这样的东西

def checklist(argument):

    data = [["sky",'79'],
            ["sky high",'30'],
            ["sky sky",'50'],
            ["sky high",'19']]
    result = ''
    for row in data:
        if argument == row[0]:
            result += row[0]+','
    if result:
        print result[:-1]  # This slice leaves off the last ','
    else:
        print '0'

请注意,这会比我的第一个答案略有不同。