gpt4 book ai didi

python - 产生所有元素都是整数的元组

转载 作者:行者123 更新时间:2023-11-28 22:47:48 24 4
gpt4 key购买 nike

我正在编写一个接收可迭代元组的函数,然后我必须生成所有元素都是整数的元组。其中条件:

对于元组中的每个元素:

  • 如果是int,保持不变
  • 如果是str,将其转换为int(如果可能,请参见下面的示例)
  • 否则返回None

    For example: 

    list(func([(1, "48")])) = [(1, 48)]
    list(func([(1, "0xf")])) = [(1, 15)]
    list(func([(1, "junk")])) = None
    list(func([([3], 4)])) = None

到目前为止,这是我的代码,看起来很糟糕而且不起作用

 def func(iterable):
for x in iterable:
for i in x:
if not ((isinstance(i, str) and i.isdigit()) or (isinstance(i, str) and isinstance(int(i, 16), int)) or isinstance(i, int)):
yield None
yield [i if isinstance(i, int) else int(i) if i.isdigit() else int(i, 16) for i in x for x in iterable]

你有更好的解决方案吗>?我是 python 的新手,非常感谢任何帮助:)

最佳答案

这有点奇怪,但看起来您想像处理 int 一样处理任何 Python 整数文字格式。最好的方法可能是调用 ast.literal_eval 来解析它,然后查看它是否解析为 int。像这样:

def intify(x):
if isinstance(x, int):
return x
parsed = ast.literal_eval(x)
if isinstance(parsed, int):
return parsed
raise ValueError('{} is not an int literal'.format(x))

请注意,您可能想要测试 isinstance(x, numbers.Integral),如果是,则返回 int(x),或者甚至只是返回 int(x) 每当它成功时,或不同的东西,取决于你想用 int-like 和 int-convertible 的东西做什么但实际上不是 int,因为 int 的某些适当定义 - 类似。

现在,您只需执行以下操作:

try:
return tuple(intify(x) for x in iterable)
except ValueError:
return None

如果你想对整个可迭代对象执行此操作,你需要一个嵌套循环,如下所示:

try:
return [tuple(intify(x) for x in subiterable) for subiterable in iterable]
except ValueError:
return None

如果您想懒惰地执行此操作,在不构建列表的情况下生成元素,则无法“提前退出”并返回 None — 一旦您已经生成了一些值,您不能不屈服他们。所以,你想要的不是直接可能的。但是如果你能解释你为什么想要它,那么类似有用的东西可能实际上是可行的。例如:

yield from (tuple(intify(x) for x in subiterable) for subiterable in iterable)

或者,如果您没有 Python 3.3:

for subiterable in iterable:
yield tuple(intify(x) for x in subiterable)

这将在第一个错误值上引发异常。因此,如果您只是使用迭代器传递给对 list 的调用,则部分构建的列表将被放弃以处理异常。

话又说回来,如果你用这个函数做的唯一事情就是构建一个列表,那么首先就没有理由使用生成器;只需返回一个列表。

关于python - 产生所有元素都是整数的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25878826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com