【问题标题】:Python: Printing verticallyPython:垂直打印
【发布时间】:2022-01-18 13:03:10
【问题描述】:

最终代码将打印状态之间的距离。我正在尝试打印带有编号和垂直编号的州名称的菜单。我真的很难找到自己的错误。

此代码不会引发任何错误,它只是不打印任何内容,为空。

state_data = """
LA  34.0522°N 118.2437°W
Florida 27.6648°N 81.5158°W
NY 40.7128°N 74.0060°W"""

states = []

import re
state_data1 = re.sub("[°N@°E]", "", state_data)

def process_states(string):
    states_temp = string.split()
    states = [(states_temp[x], float(states_temp[x + 1]), float(states_temp[x + 2])) for x in
                range(0, len(states_temp), 3)]
    return states

def menu():
    for state_data in range(state_data1):
        print(f'{state_data + 1} {name[number]}')

【问题讨论】:

  • 这段代码是引发错误还是只是打印错误?请编辑您的帖子并添加错误消息或程序输出。当我们只看帖子而不是运行您的代码并猜测问题所在时,我们会更容易提供帮助
  • 您可以在换行符上拆分airport_data,然后在空格上再次拆分,但最好将airport_data 更改为元组列表或元组字典。

标签: for-loop


【解决方案1】:

我的第一个猜测是,您的代码不会打印任何没有错误的内容,因为您从未实际执行过 process_airports()menu()

您必须在脚本末尾这样称呼它们:

something = process_airports(airport_data1)
menu()

不过,这现在会引发一些错误。所以让我们解决它们。 menu() 函数将引发错误,因为 namenumber 均未定义,并且您尝试将 range 函数应用于字符串 (airport_data1) 而不是整数。

首先修复范围错误:您在 for 循环中混合了两个想法:迭代列表中的元素 airport_data1 和迭代列表中元素的索引

你必须选择一个(我们稍后会看到你可以同时做这两个),在这个例子中,我选择遍历列表的索引。

那么,由于namenumber 都不存在于任何地方,它们将引发错误。您总是需要在某处声明变量,但是,在这种情况下,它们根本不需要,所以让我们删除它们:

def menu(data):
    for i in range(len(data)):
        print(f'{i + 1} {data[i]}')

processed_airports = process_airports(airport_data1)
menu(processed_airports)

考虑到dataprocess_airports()的输出


现在提供一些一般性建议和改进。

首先,全局变量。 请注意如何在 menu() 函数中访问 airport_data1

请注意,在我上面提出的函数中,每个变量都在函数本身中声明,没有来自更高范围的信息。同样,这不是强制性的,但会使代码更易于使用和理解。

airport_data = """
Alexandroupoli  40.855869°N 25.956264°E
Athens 37.936389°N 23.947222°E
Chania  35.531667°N 24.149722°E
Chios   38.343056°N 26.140556°E
Corfu 39.601944°N 19.911667°E"""

airports = []

import re
airport_data1 = re.sub("[°N@°E]", "", airport_data)

def process_airports(string):
    airports_temp = string.split()
    airports = [(airports_temp[x], float(airports_temp[x + 1]), float(airports_temp[x + 2])) for x in
                range(0, len(airports_temp), 3)]
    return airports

def menu(data):
    for i in range(len(data)):
        print(f'{i + 1} {data[i]}')

# I'm adding the call to the functions for clarity
data = process_airports(airport_data1)
menu(data)

打印出来的菜单现在看起来像这样:

1 ('Alexandroupoli', 40.855869, 25.956264)
2 ('Athens', 37.936389, 23.947222)
3 ('Chania', 35.531667, 24.149722)
4 ('Chios', 38.343056, 26.140556)
5 ('Corfu', 39.601944, 19.911667)

其次,这主要是供参考,但是您可以通过循环访问 enumerate() 来访问可迭代的索引和元素本身,这意味着,以下函数将打印与 range(len(data)) 完全相同的内容。如果您需要同时使用元素本身和它的索引,这会很方便。

def menu(data):
    for the_index, the_element in enumerate(data):
        print(f'{the_index + 1} {the_element}')

【讨论】:

  • 当然是这样,你所拥有的('Alexandroupoli', 40.855869, 25.956264) 是一个称为“元组”的结构。它的行为或多或少与列表相同,因此您可以像使用列表一样使用方括号选择所需的任何元素。在你的情况下,这意味着用这个print(f'{i + 1} {data[i][0]}')替换打印,其中data[i]允许你在data[0]中选择索引i处的元素,访问该元组中的第一个元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 2014-12-08
  • 2016-02-24
  • 2013-12-23
  • 1970-01-01
相关资源
最近更新 更多