比较嵌套列表字符的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
>>>