我是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
任何帮助将不胜感激。非常感谢
答案 0 :(得分:3)
解决此问题的一种方法是:为了解析两个字符串,可以使用ast.literal_eval
(doc)。首先,您从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]
答案 1 :(得分:2)
首先,我将根据字符串创建数组,并修剪所有空白
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)。
答案 2 :(得分:2)
您应该将字符串拆分成整数序列,然后遍历第一个整数并检查平方是否在第二个序列中。
plyr::ddply
输出:
dplyr
答案 3 :(得分:1)
这是一个具有列表理解以及join
对象的split
和str
方法的解决方案:
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)
答案 4 :(得分:1)
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)
答案 5 :(得分:1)
这是一种快速的方法(避免int在string1中的情况下,将浮点数转换为int会造成混淆)
const state = urlParams.state?.toString()
,以防万一,您可以使用以下方法重新映射:
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]