【问题标题】:Python isinstance not working with if statement.Python isinstance 不适用于 if 语句。
【发布时间】:2018-08-22 18:17:12
【问题描述】:

我有一个地址列表。有些地址有街道、城市、州、邮编,而其他地址只有城市、州和邮编。我做了一个for 循环将每个元素放入一个单独的变量中。问题是我没有得到正确的输出,所以我用isinstance(address[3], int] 放了一个if 语句,我这样做是为了检查第4 个元素是否在那里然后执行代码,但它只是不工作。我将在下面发布以显示我在做什么,并让我知道我在哪里搞砸了。第一个地址有街道,而第二个没有,所以我想用地址替换“-”。

address = [['123 street name, New Orleans, LA, 12345'],['New Orleans, LA, 12345']]
if isinstance(address[3], int):
    street = address[0]
    city = address[1]
    city = city.lstrip()
    state = address[2]
    state = state.lstrip()
    zip_code = address[3]
else:
    street = "-"
    city = address[0]
    city = city.lstrip()
    state = address[1]
    state = state.lstrip()
    zip_code = address[2]

【问题讨论】:

  • 您的代码是如何工作的? address 没有第四个元素,所以你不能做address[3]
  • 你得到一个IndexError,因为你的列表只有两个元素。

标签: python list isinstance


【解决方案1】:

您的代码存在多个问题。首先,address 是一个长度为一的列表列表。其次,如果您想检查地址是否包含邮政编码,您的两个示例都可以,但是您不能将它们与其他数据分开访问,因为它现在存储为字符串。尝试分离元素并将它们实际存储为字符串或整数。下一个问题是您无法检查不存在的元素。如果您知道必须存在其他数据,则可以检查列表的长度。总之,使用这些更改:

addresses = [['123 street name', 'New Orleans', 'LA', 12345],['New Orleans', 'LA', 12345]]

for address in addresses:
    if len(address) > 3:
        street = address[0]
        city = address[1]
        city = city.lstrip()
        state = address[2]
        state = state.lstrip()
        zip_code = address[3]
    else:
        street = "-"
        city = address[0]
        city = city.lstrip()
        state = address[1]
        state = state.lstrip()
        zip_code = address[2]

【讨论】:

  • 效果很好!谢谢
【解决方案2】:

你有基本正确的想法。我认为最大的问题是 if 语句中的条件,因为当只有 3 个元素时,address[3] 会抛出异常。相反,您应该使用len() 检查列表的长度。如果列表的长度为 3,那么您只能将城市、州和 zip 放入正确的变量中。如果列表的长度为 4,那么您将获得所有 4 个字段。

【讨论】:

  • 是的,这就是我遇到的问题。实际上它并没有抛出异常,而是以某种方式复制了前一个并复制了它。 len() 是诀窍。
  • @Kamikaze_goldfish 您还应该首先考虑如何获取数据。如果它是硬编码的,请使用字典列表,而不是列表列表。
【解决方案3】:

第一行

address = [['123 street name, New Orleans, LA, 12345'],['New Orleans, LA, 12345']]

实际上具有制作列表列表的效果,其中每个内部列表都包含一个字符串。我认为如果你写它可能会产生更好的效果:

addresses = [['123 street name', 'New Orleans', 'LA', '12345'],['New Orleans', 'LA', '12345']]

要检查这些字段是否存在,我会尝试

for address in addresses:
    if len(address) == 4:
        //case 1
    else:
        //case 2

如果您不想费心将字符串分解,则以下行将转换您的地址:

addresses = [address.split(', ') for address in addresses]

【讨论】:

    【解决方案4】:

    首先您需要在, 处拆分您的地址,然后检查长度并将各个部分分配给值:

    adress = '123 street name, New Orleans, LA, 12345'
    parts = address.split(', ')
    street, city, state, zip_code = parts if len(parts) == 4 else ['-'] + parts    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多