混合整数和列表

时间:2011-05-19 09:37:17

标签: python-3.x

我希望编写一个函数foo来生成以下输出:

foo(0) -> "01 00"
foo(1) -> "01 01"
foo([0]) -> "01 00"
foo([1]) -> "01 01"
foo([0,1]) -> "02 00 01"
foo([0,1,10]) -> "03 00 01 0a"

你会如何实现这个?我是否需要明确表达arguemnt的类型?

hex(value)[2:]可用于根据需要转换为十六进制。

谢谢!

百里

3 个答案:

答案 0 :(得分:3)

如果参数是单个int,请将其设为list。然后,您可以继续进行列表处理......

>>> def foo(x):
...     hexify = lambda n: hex(n)[2:].zfill(2)
...     if not isinstance(x, list):
...         x = [x]
...     return hexify(len(x)) + ' ' + ' '.join(map(hexify, x))
... 
>>> foo(0)
'01 00'
>>> foo(1)
'01 01'
>>> foo([0])
'01 00'
>>> foo([1])
'01 01'
>>> foo([0,1])
'02 00 01'
>>> foo([0,1,10])
'03 00 01 0a'

答案 1 :(得分:2)

您需要进行一些类型检查。这一切都取决于你想接受什么。

通常,您可以在list构造函数中包装某些内容并从中获取列表。

def foo(x):
    x = list(x)

但转换完全取决于list。例如:list({1: 2})不会向您[2]提供[1]

因此,如果您想保护用户免受意外,您应该检查输入是单个整数还是列表。

您可以使用isinstance

进行检查
>>> isinstance("hej", int)
False
>>> isinstance("hej", (int, list))
False
>>> isinstance([1,2,3], (int, list))
True
>>> isinstance(1, (int, list))
True

iterables的另一个问题是,您无法保证每个成员属于同一类型,例如:

[1, 'hello', (2.5,)]

我会尝试将每个项目转换为数字,如果不可能,请举手向空中发出警告并向用户发出警告。

答案 2 :(得分:2)

def tohex(n):
    ''' Convert an integer to a 2-digit hex string. '''
    hexVal = hex(n)[2:]
    return hexVal.rjust(2, '0')

def foo(input):
    # If we don't get a list, wrap whatever we get in a list.
    if not isinstance(input, list):
        input = [input]

    # First hex-value to write is length
    result = tohex(len(input))

    # Then we write each of the elements
    for n in input:
        result += " " + tohex(n)

    return result