簡體   English   中英

如何比較兩個包含數字的字符串?

[英]How do i compare two strings containing numbers?

我是Python的初學者,正努力解決以下練習。

編寫一個函數,該函數接受兩個包含用逗號分隔的整數(整數)的字符串。 該函數應返回另一個字符串,該字符串與第一個字符串相似,並具有第二個字符串中第一個字符串的平方數。 換句話說,第三個字符串應僅包含第一個字符串的平方數在第二個字符串中找到的數字

string1 = "2, 5, 3, 11" 
string2 = "19, 25, 4, 181"

returns the string3 = "2, 5"

因為第二個字符串中僅存在第一個字符串的2和5的平方。 其余的不是。

我有一個應該怎么做的想法。 首先,我創建了兩個函數,將兩個字符串都轉換為整數列表,以便可以使用split通過其索引處理每個數字。 我不知道這是否是正確的方法。 這兩個函數都返回一個列表

然后,我創建了第三個函數,以從其他兩個函數中獲取列表,使用if語句和for循環比較它們,選擇數字並將它們放在要轉換為字符串的列表中,然后將其返回。

問題是,當我運行程序時,它告訴我某些變量(s1,s2)未定義。

這是我的代碼

def f1 (stringa1):

   s1 = stringa1.split()

return s1

def f2 (stringa2):

   s2 = stringa2.split()

return s2

def mystring (s1, s2):

   lista = []

   s1=stringa1

   for i in s2:

      if (s2[i] == s1[i**2]):

        lista.append(s1)

       ls = lista(map(str,i))

return ls

任何幫助將不勝感激。 非常感謝你

解決此問題的一種方法是:為了解析兩個字符串,可以使用ast.literal_evaldoc )。 首先,您從string1創建列表,並從string2設置。

然后,您遍歷列表,並檢查該值中兩個值的冪是否在集合內。

例:

string1 = "2, 5, 3, 11"
string2 = "19, 25, 4, 181"

from ast import literal_eval

lst1 = literal_eval('[' + string1 + ']')
set2 = literal_eval('{' + string2 + '}')

rv = [i for i in lst1 if i**2 in set2]
print(rv)

印刷品:

[2, 5]

首先,我將從字符串創建數組,並修剪所有空白

arr1 = [int(str.strip()) for str in string_1.split(',')]
arr2 = set([int(str.strip()) for str in string_2.split(',')])
arr3 = [int(str.strip()) for str in string_3.split(',')]

然后,我將獲得arr1中每個值的冪,然后查看它是否存在於arr2中

arr4 = [val for arr in arr1 if pow(val,2) in arr2 ]

要解決Dio Phung關於將arr2更改為集合的評論,請執行以下操作:

如果您迷路了,Dio Phung建議將arr2更改為一個集合,因為集合提供了恆定的查找時間。 這將使在arr2中查找arr1的n ^ 2值的主要邏輯快得多(特別是在數據集很大的情況下)。

您可以在此處查看有關時間復雜度的文檔:

https://wiki.python.org/moin/TimeComplexity

通過將arr2更改為集合,我們可以執行以下主要邏輯:

pow(val,2) in arr2

在O(1)時間復雜度中,如列表中所示,它將是O(n)。

您應該將字符串拆分成整數序列,然后遍歷第一個整數並檢查平方是否在第二個序列中。

def myfunc(s1, s2):
    nums = [int(i) for i in s1.split(", ")]
    squares = {int(i) for i in s2.split(", ")}

    return ", ".join([str(num) for num in nums if num * num in squares])

string1 = "2, 5, 3, 11" 
string2 = "19, 25, 4, 181"

string3 = myfunc(string1, string2)
print(string3)

輸出:

2, 5

這是一個具有列表理解以及str對象的joinsplit方法的解決方案:

def square_isin(s1, s2):
    numbers = []
    s2_int = [int(v) for v in s2.split(", ")]
    for s in [int(v) for v in s1.split(", ")]:
        if s*s in s2_int:
            numbers.append(s)
    return ', '.join([str(v) for v in numbers])

string3 = square_isin(string1, string2)
string1 = "2, 5, 3, 11" 
string2 = "19, 25, 4, 181"

def answer(str1, str2):
    num1 = map(int, str1.split(', '))  # convert str1 into a list of ints
    num2 = set(map(int, str2.split(', ')))  # convert str2 into a list of ints
    matches = [n for n in num1 if n**2 in num2]  # create a new list of matches
    return ", ".join(map(str, matches))  # return it as a comma-separated string

answer(string1, string2)

這是一種快速的方法(避免int在string1中,將浮點數轉換為int會造成混淆)

floater = lambda x: float(x)
sqrtr = lambda x: math.sqrt(int(x))

string1 = "2, 5, 3, 11" 
string2 = "19, 25, 4, 181"

a = list(map(floater, list(string1.split(","))))
b = list(map(sqrtr, list(string2.split(",")))) 

list(set(a) & set(b))
# [2.0, 5.0]

萬一您需要整數,則可以使用以下方法重新映射:

inter = lambda x: int(x)
list(map(inter,(list(set(a) & set(b)))))
# [2, 5]

暫無
暫無

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

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