比较嵌套列表字符的ascii值的绝对差
Comparing the absolute difference in the ascii values of the characters of a nested list
我试图在 python 中输入一些来自用户的字符串元素,遍历它们以找出每个字符串元素的字符的 ascii 值与它自己的反向字符的差异,并且然后让用户知道差异是否完全相同。我的代码几乎接近预期的结果,唯一的问题是它无法确定 每个元素分别 的差异。例如:
假设这是用户输入的内容:
user_input = ['lmnop', 'acxz']
这段代码预期要做的事情,就是遍历[=52=],我们来看第一个元素lmnop:
该元素的每个字符都具有以下 ascii:
ascii_list = [108, 109, 110, 111, 112]
代码现在必须确定每两个 ascii 数字的差异:
[1, 1, 1, 1]
解释:109-108=1, 110-109=1,...
现在剩下要做的是对相同元素的反转字符串做同样的事情,即 ponml。如果你做同样的事情,你会注意到受尊敬的字符串的 ascii 差异也将是 [1, 1, 1, 1]。所以现在我们将通过打印 same
然后 移动到索引 1 中的下一个元素,即 acxz[=44 来让用户知道这一点=],做同样的进度,让用户知道,直到最后一个元素用户输入。
我的代码的问题是它不能分离元素,它采用 ALL 元素的 ascii 数字,并将其与受人尊敬的 ascii 数字进行比较,并且一劳永逸地打印结果 。我该如何解决?
这是我的代码:
queries = int(input())
user_input = []
string_ascii = []
reverse_ascii = []
reverse_list = []
normal_dif = []
reverse_dif = []
for i in range(0, queries):
user_input.append(input())
split_list = [list(x) for x in user_input]
reverse_list = [x[::-1] for x in user_input]
for j in range(0, queries):
for k in range(0, len(user_input[j])):
string_ascii.append(ord(user_input[j][k]))
reverse_ascii.append(ord(reverse_list[j][k]))
normal_dif = [abs(string_ascii[x] - string_ascii[x-1]) for x in range(1, len(string_ascii))]
reverse_dif = [abs(reverse_ascii[x] - reverse_ascii[x-1]) for x in range(1, len(reverse_ascii))]
if normal_dif in reverse_dif:
print('same')
else:
print('NOT same')
如果我的解释不清楚,您可以在这里阅读我正在尝试做的事情的完整描述:https://www.hackerrank.com/challenges/funny-string/problem (无需登录或注册) .
在此先感谢您的帮助。
如果你只是让 Whosebug 回答你的问题,那么 hackerrank 就没那么有趣了,但是你的代码太复杂了。先写一个函数,可以计算序数的绝对差,然后再写一个函数,在颠倒时测试它们是否相同
def ord_diffs(inp_str):
ords = [abs(ord(s)-ord(inp_str[i+1])) for i, s in enumerate(inp_str[:-1])]
return ords
def is_funny(inp_str):
if ord_diffs(inp_str) == ord_diffs(inp_str[::-1]):
return 'Funny'
else:
return 'Not Funny'
为什么需要对字符串进行反转来验证所有字符的距离为1?如果在您反转它们之前它们的距离均为 1,则它们的距离仍为 1。颠倒字符顺序没有区别:
from itertools import tee, starmap
def pairwise(iterable):
a, b = tee(iterable)
next(b, None)
return zip(a, b)
def is_distance_of_one(char_a, char_b):
return abs(ord(char_a) - ord(char_b)) == 1
for current_string in "lmnop", "acxz":
result = ("NOT ", "")[all(starmap(is_distance_of_one, pairwise(current_string)))]
print(f"{current_string} is {result}same")
输出:
lmnop is same
acxz is NOT same
>>>
我试图在 python 中输入一些来自用户的字符串元素,遍历它们以找出每个字符串元素的字符的 ascii 值与它自己的反向字符的差异,并且然后让用户知道差异是否完全相同。我的代码几乎接近预期的结果,唯一的问题是它无法确定 每个元素分别 的差异。例如: 假设这是用户输入的内容:
user_input = ['lmnop', 'acxz']
这段代码预期要做的事情,就是遍历[=52=],我们来看第一个元素lmnop: 该元素的每个字符都具有以下 ascii:
ascii_list = [108, 109, 110, 111, 112]
代码现在必须确定每两个 ascii 数字的差异:
[1, 1, 1, 1]
解释:109-108=1, 110-109=1,...
现在剩下要做的是对相同元素的反转字符串做同样的事情,即 ponml。如果你做同样的事情,你会注意到受尊敬的字符串的 ascii 差异也将是 [1, 1, 1, 1]。所以现在我们将通过打印 same
然后 移动到索引 1 中的下一个元素,即 acxz[=44 来让用户知道这一点=],做同样的进度,让用户知道,直到最后一个元素用户输入。
我的代码的问题是它不能分离元素,它采用 ALL 元素的 ascii 数字,并将其与受人尊敬的 ascii 数字进行比较,并且一劳永逸地打印结果 。我该如何解决? 这是我的代码:
queries = int(input())
user_input = []
string_ascii = []
reverse_ascii = []
reverse_list = []
normal_dif = []
reverse_dif = []
for i in range(0, queries):
user_input.append(input())
split_list = [list(x) for x in user_input]
reverse_list = [x[::-1] for x in user_input]
for j in range(0, queries):
for k in range(0, len(user_input[j])):
string_ascii.append(ord(user_input[j][k]))
reverse_ascii.append(ord(reverse_list[j][k]))
normal_dif = [abs(string_ascii[x] - string_ascii[x-1]) for x in range(1, len(string_ascii))]
reverse_dif = [abs(reverse_ascii[x] - reverse_ascii[x-1]) for x in range(1, len(reverse_ascii))]
if normal_dif in reverse_dif:
print('same')
else:
print('NOT same')
如果我的解释不清楚,您可以在这里阅读我正在尝试做的事情的完整描述:https://www.hackerrank.com/challenges/funny-string/problem (无需登录或注册) .
在此先感谢您的帮助。
如果你只是让 Whosebug 回答你的问题,那么 hackerrank 就没那么有趣了,但是你的代码太复杂了。先写一个函数,可以计算序数的绝对差,然后再写一个函数,在颠倒时测试它们是否相同
def ord_diffs(inp_str):
ords = [abs(ord(s)-ord(inp_str[i+1])) for i, s in enumerate(inp_str[:-1])]
return ords
def is_funny(inp_str):
if ord_diffs(inp_str) == ord_diffs(inp_str[::-1]):
return 'Funny'
else:
return 'Not Funny'
为什么需要对字符串进行反转来验证所有字符的距离为1?如果在您反转它们之前它们的距离均为 1,则它们的距离仍为 1。颠倒字符顺序没有区别:
from itertools import tee, starmap
def pairwise(iterable):
a, b = tee(iterable)
next(b, None)
return zip(a, b)
def is_distance_of_one(char_a, char_b):
return abs(ord(char_a) - ord(char_b)) == 1
for current_string in "lmnop", "acxz":
result = ("NOT ", "")[all(starmap(is_distance_of_one, pairwise(current_string)))]
print(f"{current_string} is {result}same")
输出:
lmnop is same
acxz is NOT same
>>>