如何拆分地址中的数字和字符串

2024-05-19 01:15:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些代码来格式化地址

def format_address(address_string):
  house_number = ()
  street_name = ()

  address_string.split()

  for house_number, street_name in enumerate(address_string):
    if address_string[0].isnumeric():
      house_number = address_string

    elif address_string.isalpha():
      street_name = address_string


  return "house number {house_number} on street named {street_name}".format(house_number=house_number, street_name=street_name)

print(format_address("123 Main Street"))
print(format_address("1001 1st Ave"))
print(format_address("55 North Center Drive"))

期望输出应为:
名为Main street的安街123号房屋

我的输出: t街主街123号房屋

我缺少什么,请帮忙


Tags: 代码nameformatstreetnumberforstringmain
3条回答

我认为这就是你想要实现的目标:

def format_address(address_string):

    house_number, street_name = address_string.split(' ', 1)

    return f"house number {house_number} on street named {street_name}"

print(format_address("123 Main Street"))
print(format_address("1001 1st Ave"))
print(format_address("55 North Center Drive"))

输出:

house number 123 on street named Main Street
house number 1001 on street named 1st Ave
house number 55 on street named North Center Drive
address_string.split()

这意味着:用来自address_string的单词创建一个新的列表,然后忽略它address_string未更改的。您需要给出此.split()调用其自身名称的结果。就像你写3 + 4一样,3的值不会改变,而得到的7只有在你用它做一些事情时才有用

for house_number, street_name in enumerate(address_string):

这意味着:每次通过循环,house_number变成一个从零开始向上计数的数字,而street_name变成address_string中的下一个字母(因为我们仍在使用原始字符串)

if address_string[0].isnumeric():
    house_number = address_string

这意味着:如果address_string中的第一个字符是数字,则每次通过循环,house_number都将替换为整个address_stringaddress_string永远不会改变,因此此比较始终具有相同的结果。类似于"123 Main Street"的字符串以"1"开头,这是数字,因此house_number成为整个字符串"123 Main Street"

每次通过循环,house_numberfor循环条件替换,然后再次在这个if中替换。一般来说,您不希望为循环变量赋值;这不是很有帮助,因为它们会不断被循环重新分配

elif address_string.isalpha():
  street_name = address_string

由于满足了if条件,因此从不测试该elif


要解决这个问题,你必须想清楚。你想迭代什么?这些东西的好名字是什么?有什么规则告诉你这个东西是否应该用于house_number?有什么规则告诉你这个东西是否应该用于address_string?然后确保您使用的测试是有意义的-您正在测试您实际想要使用的值吗?您是否将其分配到正确的位置

正如卡尔在回答问题时所说的,你必须想清楚

只是一个简单的指针。如果数字总是第一个元素,我会做一些简单的事情如下:

拆分“”中的字符串(空格字符),第一个元素是数字,其余由*元素表示的是一个名为street_name_as_list的列表,然后。街道名称用空格连接此列表中的所有单词

def format_address(address_string):
  house_number = ()
  street_name = ()

  house_number, *street_name_as_list = address_string.split(" ")
  street_name = " ".join(street_name_as_list)

  return "house number {house_number} on street named {street_name}".format(house_number=house_number, street_name=street_name)

print(format_address("123 Main Street"))
print(format_address("1001 1st Ave"))
print(format_address("55 North Center Drive"))

然后,您可以为house_number或street_name添加任何验证,而无需在字符串中使用循环

相关问题 更多 >

    热门问题