【问题标题】:My function returns a list with a single integer in it, how can I make it return only the integer?我的函数返回一个包含单个整数的列表,我怎样才能让它只返回整数?
【发布时间】:2016-02-22 15:02:48
【问题描述】:

如何从结果中删除括号,同时保持函数为一行代码?

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]

【问题讨论】:

  • 为什么不使用带键、值的字典呢?你真的不想要一个列表。
  • day_to_number 返回一个列表。只返回你想要的元素。如果您知道只有 1 个元素,请抓住 [0]

标签: python list list-comprehension indexof


【解决方案1】:

列表理解是多余的。如果您的列表不包含重复项(如您的示例数据所示,请执行此操作)

>>> 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

【讨论】:

    【解决方案2】:

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

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

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

    return day_list.index(inp)
    

    【讨论】:

    • 你打败了我 :(
    【解决方案3】:

    试试这个:

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

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

    day_list.index(inp)
    

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

    【讨论】:

      【解决方案4】:

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

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

      用途:

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

      【讨论】:

        【解决方案5】:

        您还可以使用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'
        

        【讨论】:

        • FWIW,datetimecalendar 模块是区域敏感的。因此,如果您知道如何使用locales,您可以获得已安装的任何语言环境的日/月名称。
        【解决方案6】:

        这看起来过于复杂。您不需要此任务的列表理解。您可以使用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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-19
          • 2021-06-27
          • 2016-10-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多