簡體   English   中英

如何將包含整數和字符的字符串轉換為 integer 並且有效?

[英]How do I convert a string with integers and characters to an integer and it work?

from function import *
import requests

def main():
#define your api "endpoint"
  url = "https://swapi.dev/api/people"
  resObj = requests.get(url)
  print("STATUS CODE: ", resObj)

  typewriter("Processed API URL call. Returning JSON object.", 0.01)
  #let's take json and convert to python dictionary
  resDict = resObj.json()
 
  #list of char dictionaries
  characters = resDict['results']
  for character in characters:
    # print(character)
    charBirth = character['birth_year']
    charBirthStrip = charBirth.strip('BBY')
    try:
      charBirthMod = int(float(charBirthStrip))
    except:
      charBirthAD = ''
    charBirthAD = bby(charBirthMod)
    print("Name:", character['name'])
    print("Height:", character['height'], "cm")
    print("Mass:", character['mass'], "kg")
    print("Birth year:", charBirthAD, "AD")
    print("Gender:", character['gender'])
main()

然后相關的 function 是

def bby(birthyear):
  #0 B.B.Y. (AD 1815)
  adYear = 1815 - birthyear

所以我的目標是將 api 中字典的返回值轉換為“49BBY”,然后取出字母,將其轉換為 integer,然后執行 bby bby() function 中設置的數學方程式。它是什么返回是這樣的: Birth year: None AD

謝謝

您需要將return添加到您的 function:

def bby(birthyear):
  #0 B.B.Y. (AD 1815)
  adYear = 1815 - birthyear
  return adYear

編輯:

在異常中你可以嘗試這樣的事情,因為在你的代碼中當你有異常時它總是會嘗試使用bby

    try:
        charBirthAD = bby(int(float(charBirthStrip)))
    except Exception as e:
        charBirthAD = ''

得到字符串后:'49BBY'

你得到 integer 這個:

import re
your_str = '49BBY'
temp = re.findall(r'\d+', your_str)
result = int(temp[0])

如果你想要 function 返回值,你需要將它添加到你的 function:

return your_value_to_return

使用控制結構(字典)可以更好地處理這個問題。

關於 birth_year 的具體問題可以很容易地處理。 API 將 birth_year 返回為“未知”或 nBBY(其中 n 為 1 位或多位數字)。 因此,您只需要檢查字符串以什么結尾。

考慮一下:

from requests import Session
from requests.exceptions import HTTPError

url = 'https://swapi.dev/api/people/'

def bby(s):
    if s.endswith('BBY'):
        return int(1815 - float(s[:-3]))
    return s

# keys that require suffixes
suffix = {'height': 'cm', 'mass': 'kg'}
# keys and their output mappings
keys = {'name': 'Name', 'height': 'Height', 'mass': 'Mass', 'birth_year': 'Birth year', 'gender': 'Gender'}
# keys that require conversion
convert = {'birth_year': bby}
# parameters
params = {'page': 1}

with Session() as session:
    while True:
        try:
            (r := session.get(url, params=params)).raise_for_status()
            j = r.json()
            for d in j['results']:
                for k, v in keys.items():
                    value = d.get(k, 'unknown')
                    if (func := convert.get(k)):
                        value = func(value)
                    if value != 'unknown' and (sfx := suffix.get(k)):
                        print(f'{v}: {value}{sfx}')
                    else:
                        print(f'{v}: {value}')
            params['page'] += 1
        except HTTPError:
            break

處理是固定的。 變量是控制字典中的內容。 只需對這些結構進行適當的調整,您就可以在不修改主要代碼的情況下添加或刪除功能。

部分output:

Name: Luke Skywalker
Height: 172cm
Mass: 77kg
Birth year: 1796
Gender: male
Name: C-3PO
Height: 167cm
Mass: 75kg
Birth year: 1703
Gender: n/a
Name: R2-D2
Height: 96cm
Mass: 32kg
Birth year: 1782
Gender: n/a
Name: Darth Vader
Height: 202cm
Mass: 136kg
Birth year: 1773
Gender: male
Name: Leia Organa
Height: 150cm
Mass: 49kg
Birth year: 1796
Gender: female
Name: Owen Lars
Height: 178cm
Mass: 120kg
Birth year: 1763
Gender: male
Name: Beru Whitesun lars
Height: 165cm
Mass: 75kg
Birth year: 1768
Gender: female
Name: R5-D4
Height: 97cm
Mass: 32kg
Birth year: unknown
Gender: n/a
Name: Biggs Darklighter
Height: 183cm
Mass: 84kg
Birth year: 1791
Gender: male
Name: Obi-Wan Kenobi
Height: 182cm
Mass: 77kg
Birth year: 1758
Gender: male
Name: Anakin Skywalker
Height: 188cm
Mass: 84kg
Birth year: 1773
Gender: male
Name: Wilhuff Tarkin
Height: 180cm
Mass: unknown
Birth year: 1751
Gender: male
Name: Chewbacca
Height: 228cm
Mass: 112kg
Birth year: 1615
Gender: male
Name: Han Solo
Height: 180cm
Mass: 80kg
Birth year: 1786
Gender: male
Name: Greedo
Height: 173cm
Mass: 74kg
Birth year: 1771
Gender: male
Name: Jabba Desilijic Tiure
Height: 175cm
Mass: 1,358kg
Birth year: 1215
Gender: hermaphrodite
Name: Wedge Antilles
Height: 170cm
Mass: 77kg
Birth year: 1794
Gender: male

如果您想避免額外的導入並使函數/方法盡可能明確並嚴格按照您的描述進行操作,您可以編寫:

def bby(date_bby: str, date: int) -> int:
    """
    :param date_bby: e.g. '49BBY'
    :param date: e.g. 1815
    """
    try:
        return int(''.join(filter(str.isdigit, date_bby))) - date
    except ValueError:
        print("BBY date was somehow invalid.")
        return date

更新我根據@OldBill 評論添加了一個try-except 語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM