【问题标题】:Python odd numbers from list列表中的Python奇数
【发布时间】:2021-11-13 03:31:51
【问题描述】:

所以我给出了一个带有数字的列表,我需要从列表中获取奇数并将它们相加,问题是我只需要在 while 循环中从列表中获取前 5 个奇数,这是我想出了什么:

num_list = [422, 136, 524, 85, 96, 719, 85, 92, 10, 17, 312, 542, 87, 23, 86, 191, 116, 35, 173, 45, 149, 59, 84, 69 , 113, 166]
runs = 0
odd = []


while runs <=5:
    for i in num_list:
        if i % 2 == 1:
            odd.append(i)
            runs += 1
print(odd)

代码运行但我的计数器不工作,它附加所有奇数而不是它在迭代中找到的前 5 个,这里有什么问题?

编辑:谢谢大家的回答,没有while循环会更容易,但他们要求我使用while循环。

【问题讨论】:

标签: python


【解决方案1】:

您不需要外部 while 循环。它只重复该过程5次。 这应该可以。

num_list = [422, 136, 524, 85, 96, 719, 85, 92, 10, 17, 312, 542, 87, 23, 86, 191, 116, 35, 173, 45, 149, 59, 84, 69 , 113, 166]
runs = 0
odds = []

for n in num_list:
    if n % 2 == 1:

        odds.append(n)
        runs += 1
        if runs == 5:
            break
print(odds)

【讨论】:

  • 这是迄今为止最合理的答案(其中一个答案只是这个的副本)。不过有一些(非常)小问题:if 不是一个函数,所以写像if(runs == 5) 这样的条件检查有点难看(观点)。通常i 更适合索引变量,在这里使用n(也是意见)。最后,odd 更适合命名为odds。我意识到您只是在复制 OP 的 odd 列表。主要为未来的读者指出这一点。
  • 谢谢@ddejohn,我已经做出了你指出的改变。
【解决方案2】:

你快到了。

但是在这种情况下,您不需要两个嵌套循环,您可以在 for 循环的末尾检查是否已经有足够的数字,然后中断循环。

runs = 0
for i in num_list:
    if i % 2 == 1:
        odd.append(i)
        runs += 1
        if runs == 5:
           break
print(odd)

否则,您可以检查结果数组的长度,而不是计算运行次数。

odd = []
for i in num_list:
    if i % 2 == 1:
        odd.append(i)
        if len(odd) == 5:
          break
print(odd)

随着您在学习 Python 的过程中取得进展,您可能会了解可用于此类任务的其他技术。例如,使用list comprehensions

odd = [i for i in array if i % 2 == 1][:5]

该实现的缺点是它首先计算整个数组的奇数,然后丢弃除前 5 个以外的所有内容。 您可以使用generators 来解决这个问题。

odd = (i for i in array if i % 2 == 1)
print(list(next(odd) for _ in range(5)))

之前的sn-p只是为了给大家展示一些新的语言特性。有problems with that implementation,所以我不会真正使用它。

python 的优点之一是其出色的标准库。您可能会熟悉 itertools 模块。

import itertools
odds = (i for i in array if i % 2 == 1)
list(itertools.islice(odds, 5))

【讨论】:

  • 除非您附加,否则没有必要检查长度。
  • 检查长度毫无意义,运行计数器效率更高。我想说完全删除第二个版本。
  • FWIW 这并没有增加太多讨论,因为现有答案已经提供了几乎逐字记录的相同解决方案。
  • 重点只是给OP一些不同的想法,帮助他更好的理解编码和python。
  • 另一种在没有itertools的情况下从生成器中分割前N个值的方法是使用范围为zip()的生成器:print([i for i, _ in zip(odd, range(5))])
【解决方案3】:

看看这个。您可以使用while循环中的条件来检查奇数列表的长度。

num_list = [422, 136, 524, 85, 96, 719, 85, 92, 10, 17, 312, 542, 87, 23, 86, 191, 116, 35, 173, 45, 149, 59, 84, 69 , 113, 166]
odd = []
i = 0

while len(odd) < 5:
    if num_list[i] %2 != 0:
        odd.append(num_list[i])
    i+=1
       
print(odd)

【讨论】:

  • while 循环在这里并不合适,因为我们正在通过num_list 处理有限数量的元素,因此具有先验知识迭代次数的上限。也就是说,最好运行一个计数器而不是查询odd 迭代的长度,因为这是一个相当昂贵的操作。此外,此解决方案不考虑不包含至少 5 个奇数的列表,并且在这些情况下会引发 IndexError
  • 这正是我所需要的,非常感谢你,我也试着用长度来做,但是检查你的代码我发现我写错了 len。
  • @ddejohn 是的,你说得对,有机会获得IndexError
【解决方案4】:

您可以考虑从 num_list 创建奇数生成器,然后运行 ​​5 次生成器以返回前 5 个奇数。

num_list = [422, 136, 524, 85, 96, 719, 85, 92, 10, 17, 312, 542, 87, 23, 86, 191, 116, 35, 173, 45, 149, 59, 84, 69 , 113, 166]
odd=(x for x in num_list if x%2!=0)  # generator will return only odd numbers using source as num_list
sumOdds=0
for i in range(5):
   sumOdds+=next(odd)  # next runs generator and returns value

【讨论】:

  • sum是Python内置函数,请选择不同的变量名!
【解决方案5】:

试试这个。

num_list = [422, 136, 524, 85, 96, 719, 85, 92, 10, 17, 312, 542, 87, 23, 86, 191, 116, 35, 173, 45, 149, 59, 84, 69 , 113, 166]
i=0
odd_nums=[]
while(i < len(num_list)):
      
    # checking condition
    if num_list[i] % 2 != 0 and len(odd_nums)<5:
        odd_nums.append(num_list[i])
      
    # increment i  
    i += 1
print(odd_nums)

【讨论】:

  • 也许你应该在找到 5 个奇数后打破循环?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多