【问题标题】:Trying to use list index in for loop尝试在 for 循环中使用列表索引
【发布时间】:2020-09-24 14:43:34
【问题描述】:

我在解决这个问题时遇到了一些麻烦。 我有一个具有random.randint(alpha_low,alpha_high) 的函数。 alpha_lowalpha_high 是使用函数 ord 转换为数字值的字母。然后我使用函数chr 将它们转回,这样我得到一个随机字母,并将其附加到final_list. 问题是我想要列表的一半大写,一半小写。但是现在,由于某种原因,我的代码没有打印一半,尽管我指定我希望它的一半保持不变,而一半是.upper()

import random
def alpha_list(num_values, alpha_low, alpha_high):
        
    final_list = []
    
    for letter in range(num_values):
        rando = (chr(random.randint(alpha_low, alpha_high)))
        final_list.append(rando)

    for i in range(len(final_list)):
        if final_list[i] > final_list[int((len(final_list)/2)-1)]:
            final_list[i] = final_list[i].upper()
        else:
            pass

    return final_list

user_input_number = eval(input('please type an EVEN amount of letters you want: '))

user_input_first_letter = ord(input('please type the first letter of the limits(lower case): '))

user_input_last_letter = ord(input('please type the last letter of the limits(lower case): '))

print(alpha_list(user_input_number, user_input_first_letter, user_input_last_letter))

我尝试将列表拆分为 2 个列表,并将该列表大写,然后再次合并列表,但我觉得这不是最好的方法。

【问题讨论】:

  • 你不应该 eval 未经处理的用户输入,除非你想让坏事发生。
  • 要跟进 flakes 评论,请查看stackoverflow.com/questions/23294658/…@ 上的这篇文章“询问用户输入直到他们给出有效响应”

标签: python python-3.x list loops


【解决方案1】:

考虑到用户输入的评估注意事项,您遇到的问题与代码有关:

for i in range(len(final_list)):
        if final_list[i] > final_list[int((len(final_list)/2)-1)]:
            final_list[i] = final_list[i].upper()
        else:
            pass

由于 final_list 已经包含所有小写字母,您只需将列表的后半部分设为大写即可。下面的语句完成了这个任务:

final_list = final_list[0:len(final_list)//2] + 
              [x in final_list[len(final_list)//2:] x.upper()]

【讨论】:

    【解决方案2】:

    您正在比较 final_list 中的字母。您需要比较索引以将一半的字母设置为大写。

    变化:

    if final_list[i] > final_list[int((len(final_list)/2)-1)]:
    

    到:

    if i > len(final_list)/2 - 1:
    

    【讨论】:

      【解决方案3】:

      AZ 的 ASCII 值是 65 到 90。要获得小写字母,您需要在该值上加上 32。

      您可以使用这些初始值(65 到 90)作为边界来确定字母,并在列表长度的中途添加 32:

      #!/usr/bin/env python3
      
      import random
      
      def build_list(length):
          l = [''] * length
          for i in range(length):
              uc = 32 if i >= length // 2 else 0
              l[i] = chr(random.randint(65, 90) + uc)
          return l
      
      print(build_list(10)) # ['L', 'M', 'Q', 'U', 'H', 'w', 'x', 'o', 'j', 'u']
      

      根据需要调整您的字母范围。

      【讨论】:

        【解决方案4】:
        final_list = [item.upper() if idx > len(final_list) else item for idx, item in enumerate(final_list)]
        

        这里我们再次迭代列表,但使用enumerate 给出了每个元素的索引,我们可以使用该索引根据基于索引的条件构造新列表。

        更简洁的地图使用方式:

        final_list[len(final_list//2):] = list(map(str.upper, final_list[len(final_list//2):]))
        

        这里我们只得到列表的一半,并将 str.upper 应用于该一半中的每个元素,并将新的一半分配给旧的一半。

        【讨论】:

          【解决方案5】:

          您可以使用单个for loop 来完成它。试试这个,让我知道这是否适合你,或者你需要任何解释。

          代码:

          import random
          from typing import List
          
          
          def alpha_list(letters: int,
                         start: int,
                         stop: int,
                         randomize: bool = True) -> List[str]:
            """
            Return list of evenly* distributed characters with mixed cases.
          
            Args:
              letters: Maximum number of characters required in the list.
              start: Starting ordinal range.
              stop: Stopping ordinal range.
              randomize: Boolean to return random sequence.
          
            Returns:
              List of characters split in upper and lower cases.
            """
            chars = []
          
            for idx in range(letters):
              temp = (chr(random.randint(start, stop)))
              chars.append(temp.upper() if idx % 2 else temp)
          
            if randomize:
              random.shuffle(chars)
          
            return chars
          
          
          # Usage:
          number = int(input("Please enter even amount of characters you want: "))
          first = ord(input("Please type the first character of the limits in lowercase "
                            "[ex: a]: "))
          last = ord(input("Please type the last character of the limits in lowercase "
                           "[ex: z]: "))
          
          print(alpha_list(number, first, last))
          

          输出:

          >>> Please enter even amount of characters you want: 10
          >>> Please type the first character of the limits in lowercase [ex: a]: a
          >>> Please type the last character of the limits in lowercase [ex: z]: z
          ['r', 'w', 'r', 'i', 'z', 'U', 'F', 'Z', 'H', 'F']
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-07-30
            • 2017-09-07
            • 1970-01-01
            • 1970-01-01
            • 2021-12-08
            • 2013-12-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多