我的函数返回一个包含单个整数的列表,如何让它只返回整数?

时间:2016-02-22 15:02:49

标签: python list list-comprehension indexof

如何在保持函数单行代码的同时从结果中删除括号?

day_list = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]

def day_to_number(inp):
    return [day for day in range(len(day_list)) if day_list[day] == inp]

print day_to_number("Sunday")
print day_to_number("Monday")
print day_to_number("Tuesday")
print day_to_number("Wednesday")
print day_to_number("Thursday")
print day_to_number("Friday")
print day_to_number("Saturday")

输出:

[0]
[1]
[2]
[3]
[4]
[5]
[6]

6 个答案:

答案 0 :(得分:13)

列表理解是过度的。如果您的列表不包含重复项(如您的示例数据所示,那就是)

>>> def day_to_number(inp):
...     return day_list.index(inp)
... 
>>> day_to_number("Sunday")
0

我还建议让day_list成为函数的一个参数,即:

>>> def day_to_number(inp, days):
...     return days.index(inp)
... 
>>> day_to_number("Sunday", day_list)
0

在全局名称空间中查找它有点难看。

为了使整个事情更有效率(list.index是O(n))使用字典:

>>> days = dict(zip(day_list, range(len(day_list))))
>>> days
{'Monday': 1, 'Tuesday': 2, 'Friday': 5, 'Wednesday': 3, 'Thursday': 4, 'Sunday': 0, 'Saturday': 6}
>>>
>>> def day_to_number(inp, days):
...     return days[inp]
... 
>>> day_to_number("Sunday", days)
0

答案 1 :(得分:6)

返回第一项,而不是列表:

return [day for day in range(len(day_list)) if day_list[day] == inp][0]

但是真正想要做的是改变你的逻辑:

return day_list.index(inp)

答案 2 :(得分:3)

试试这个:

return [day for day in range(len(day_list)) if day_list[day] == inp][0]

但是,这不是实现这一目标的最有效方法。试试这个:

day_list.index(inp)

我知道看起来我复制了另一个答案,我发誓我没有:)

答案 3 :(得分:3)

这是字典的一个很好的用例:

>>> day_map = {day: index for index, day in enumerate(day_list)}

使用:

>>> day_map['Sunday']
0
>>> day_map['Tuesday']
2

答案 4 :(得分:2)

您还可以使用calendar模块,该模块具有为工作日定义的常量(英文):

>>> import calendar
>>> def day_to_number(day):
...     return getattr(calendar, day.upper())
... 
>>> day_to_number('wednesday') 
2 # Note that 0 = 'Monday'

如果您使用此功能,则应该添加一些错误处理:

>>> day_to_number('epoch')
1970

或者:

>>> day_to_number('foo')
Traceback (most recent call last):
  File "<ipython-input-22-4649e99206ae>", line 1, in <module>
    day_to_number('foo')
  File "<ipython-input-14-bf0518eb14b5>", line 2, in day_to_number
    return getattr(calendar, day.upper())
AttributeError: 'module' object has no attribute 'FOO'

答案 5 :(得分:1)

这看起来过于复杂。您不需要对此任务进行列表理解。您可以使用index()方法:

>>> def day_to_number(inp):
...     return day_list.index(inp)
...
>>> day_to_number("Sunday")
0
>>> day_to_number("Monday")
1
>>> day_to_number("Saturday")
6

如果您传递的值无效,则会引发ValueError