0

我有一个类似下面的功能。我尝试做的是假设我有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
4

5 回答 5

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
于 2013-05-15T15:36:06.160 回答
0

听起来你不希望发生任何事情 ifargument不等于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'

请注意,这将与我的第一个答案有所不同。

于 2013-05-15T15:41:32.147 回答
0

如果当前元素 not ,您的else语句会导致循环打印,这种情况经常发生。0argument

您要么必须制作一个单独的列表并在循环之外进行检查:

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']))
于 2013-05-15T15:39:19.180 回答
0

为什么不维护 aboolean以防没有行匹配您的输入并检查boolean最后?这将避免打印这么多的 0。

于 2013-05-15T15:35:57.370 回答
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
于 2013-05-15T15:38:34.893 回答