Bing 聊天控制台和 PyCharm 中的结果不同?

different results in bing chat console and pycharm?

提问人:Saeed 提问时间:8/9/2023 更新时间:8/9/2023 访问量:42

问:

当我在 pycharm 中运行此代码时,我得到的结果与在 bing 聊天中运行时不同。

在pycharm中我得到

[['ABC'], ['A', 'BC'], ['A', 'B', 'C']]

但是在必应聊天中,我得到了

[['a', 'b', 'c'], ['a', 'bc'], ['ab', 'c'], ['abc']]

My pycharm interpreter(3.11) and decoding(utf-8) are the same as the bing chat.

代码是

def get_all_sublists(char_list):
    if not char_list:
        return [[]]
    rest = get_all_sublists(char_list[1:])
    result = rest + [[char_list[0]] + x for x in rest]
    return result

char_list = ["a","b","c","ab","bc","abc"]
all_sublists = get_all_sublists(char_list)
matching_sublists = [x for x in all_sublists if ''.join(x) == char_list[-1]]
print(matching_sublists)
python pycharm openai-api 必应

评论

0赞 Raheel Waqar 8/9/2023
结果的差异是由于 rest 变量中子列表的顺序造成的。get_all_sublists 函数使用递归将列表拆分为两部分:第一个元素和列表的其余部分。在 PyCharm 中,递归是使用堆栈实现的,这意味着添加到结果中的最后一个子列表是第一个要返回的子列表。在必应聊天中,递归是使用队列实现的,这意味着添加到结果的第一个子列表是第一个要返回的子列表。
0赞 itprorh66 8/9/2023
鉴于列表以不同的顺序包含相同的元素位,这里是否有问题?
0赞 Saeed 8/9/2023
谢谢大家,我觉得这里应该有一个简单的解决方法,但我只是不知道那是什么

答:

0赞 Raheel Waqar 8/9/2023 #1

结果的差异是由于 rest 变量中子列表的顺序造成的。get_all_sublists 函数使用递归将列表拆分为两部分:第一个元素和列表的其余部分。然后,它会在列表的其余部分调用自己,并将第一个元素添加到结果中的每个子列表。结果中子列表的顺序取决于递归的实现方式。

在 PyCharm 中,递归是使用堆栈实现的,这意味着添加到结果中的最后一个子列表是第一个要返回的子列表。这会导致 rest 变量中子列表的顺序相反。例如,当 char_list 为 [“a”,“b”,“c”] 时,其余变量为 [[]、['c']、['b']、['b'、'c']、['a']、['a', 'c']、['a', 'b']、['a', 'b', 'c']]。这就解释了为什么你得到 [['abc'], ['a', 'bc'], ['a', 'b', 'c']] 作为输出。

在必应聊天中,递归是使用队列实现的,这意味着添加到结果的第一个子列表是第一个要返回的子列表。这会导致 rest 变量中子列表的顺序保持不变。例如,当 char_list 为 [“a”,“b”,“c”] 时,其余变量为 [[]、['a']、['b']、['a', 'b']、['c']、['a', 'c']、['b', 'c'], ['a', 'b', 'c']]。这就解释了为什么你得到 [['a', 'b', 'c'], ['a', 'bc'], ['ab', 'c'], ['abc']] 作为输出。

评论

0赞 Saeed 8/9/2023
感谢 Raheel 的精彩回答,我不是程序员,有没有办法解决这个问题?我想要队列递归给出的结果,我怎样才能让 pycharm 使用这个递归而不是堆栈?再次感谢
0赞 Raheel Waqar 8/9/2023
对不起,但我认为你不能让 PyCharm 使用队列递归而不是堆栈递归。PyCharm 是 Python 的集成开发环境 (IDE),Python 默认使用堆栈递归。在 Python 中模拟队列递归的一种可能方法是使用 collections 模块中的 deque 作为辅助数据结构。deque 是一个双端队列,允许从两端快速插入和删除。您可以使用 append() 和 popleft() 方法对 deque 中的元素进行排队和取消排队。
0赞 Saeed 8/9/2023
非常感谢您的回复和提示,我会尝试这些或其他方式。帮了大忙