【发布时间】:2017-02-06 14:37:05
【问题描述】:
我正在尝试更好地理解 Python 中的列表理解。我用一个相当不雅的解决方案完成了关于代码战的在线挑战,如下所示。
挑战是:
- 给定一个偶数列表和一个奇数,返回奇数
- 给定一个奇数列表和一个偶数,返回偶数
我的(不优雅的)解决方案是:
def find_outlier(integers):
o = []
e = []
for i in integers:
if i % 2 == 0:
e.append(i)
else:
o.append(i)
# use sums to return int type
if len(o) == 1:
return sum(o)
else:
return sum(e)
效果很好,但似乎很暴力。我认为使用 o 和 e 之类的占位符列表启动(大多数)函数非常“像菜鸟”,我错了吗?
我很想更好地理解为什么这个解决方案适用于奇数列表,但在偶数列表上失败,以便更好地理解列表理解:
def find_outlier(integers):
if [x for x in integers if x % 2 == 0]:
return [x for x in integers if x % 2 == 0]
elif [x for x in integers if x % 2 != 0]:
return [x for x in integers if x % 2 != 0]
else:
print "wtf!"
o = [1,3,4,5]
e = [2,4,6,7]
In[1]: find_outlier(o)
Out[1]: [4]
In[2]: find_outlier(e)
Out[2]: [2, 4, 6]
Out[2] 应该返回 7。
提前感谢您提供任何见解。
【问题讨论】:
-
列表推导不是最好的解决方案,不是。尝试通过检查最少数量的元素来解决它(前 2 个元素,如果它们的类型不同,则获得第 3 个以打破平局,否则迭代直到找到不适合尾部的元素)。跨度>
-
@D8Amonk 这就是那种会引入错误的假设。当然:您假设,但是如果您在编写列表时在某些时候将
178与17错误输入,您很容易在不知情的情况下结束,在这种情况下,如果您不这样做不要检查你会得到错误的结果。安全总比抱歉并引发异常好,尤其是在这种情况下,检查该条件是计算的一部分,因此您基本上没有性能损失。 -
@D8Amonk:随时欢迎您进行自我回答 :-) 不过,请务必涵盖“我的功能为什么失败”的情况;你正在为有同样问题的人写这篇文章。
-
@Bakuriu:因为这是一个编码挑战,我认为代码可以假设只有一个异常值。
-
@MartijnPieters 然而,问题和答案应该不仅对 OP 有用。其他人可能必须在现实生活中解决同样的问题,在这种情况下,更好的解决方案也是处理错误情况的解决方案。
标签: python list list-comprehension