1

如果我的问题看起来微不足道,我深表歉意。我宁愿在聊天室里问这个;但是,我现在的名声太低了,所以我无法在 Python 聊天室问任何问题。我目前正在为一堂课学习 Python,老师给了我们一些练习题来帮助我们快速学习。我现在正在构建的函数需要一个数字列表并将其转换为字符串。我遇到的问题是我的 if 语句永远不会评估为真。我尝试了几种处理变量的方法,并添加了许多打印语句以查看它们是否应该相等,但无济于事。再次提前感谢。我保证我只是在研究和尝试了很多方法后才问,但现在不知所措......这是我的代码:

def nlist2string(nlist):
    characters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
    numbers = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25']
    newList = []
    nListLen = len(nlist)         # var msgLen will be an integer of the length

    print 'Number list before conversion: ', nlist

    index = 0
    while index < nListLen:
        print 'Index at: ', nlist[index]
        num = nlist[index]
        print 'Is num equal to nlist indexed? ', num
        newNum = num % 26

        i = 0
        while i < 26:
            num1 = newNum
            num2 = numbers[i]
            print 'num1 = ', num1
            print 'num2 = ', num2
            if (num1 == num2):
                newList.append(characters[i])
                print 'Here is the current newList: ', newList
            else:
                print 'They never equal each other.'
            i = i + 1
        index = index + 1
    return newList

    numMessage = [28, 0, 33]
    convertedNumMsg = nlist2string(numMessage)
    print 'Number list after conversion: ', convertedNumMsg
4

4 回答 4

5

您正在尝试将整数与字符串进行比较,请尝试将您的定义更改为numbers以下内容:

numbers = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]

或者,numbers = range(26).

目前,在比较num1and时num2,您将进行比较,例如4 == '4',这永远不会是真的:

>>> 4 == '4'
False

作为更改创建numbers列表方式的替代方法,您可以在比较之前转换num2为整数或num1字符串,因此要么num1 == int(num2)要么str(num1) == num2.

于 2013-03-29T18:35:26.847 回答
1

你有一个字符串列表,数字 0-25。
在 Python 中,字符串永远不会等于数字,因此,num1 == num2始终为 False。

所以,应该是

numbers = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]

更合适(并且会起作用)。

甚至更好

numbers = range(26)

如果您不想编辑numbers的值,请使用以下条件:

if num1 == int(num2):

这会将 num2 转换为整数,这是您想要做的。
此外,在这种情况下,您可以使用map (Built-in Function),以提高可读性,如下所示:

numbers = map(str, range(26))
于 2013-03-29T18:48:00.457 回答
1

上面的答案正确地解决了这个问题,但作为一般提示:将值列表减少为单个值时,请使用该reduce函数。我当然意识到这是一个学习练习,但了解这项工作的相关内置功能会很有用。这使您的功能更短:

def nlist2string(nlist):

    def convert_to_alpha(s):
        if isinstance(s,str): //check if s is already a string
            return s          //if it is, return it unchanged
        else:
            return str(unichr(s+97)) //otherwise, get the corresponding alphabet
                                     //and return that
    def reduce_func(x,y):
        //convert the numbers to alphabets
        //and join the two together
        return convert_to_alpha(x) + convert_to_alpha(y) 

    return reduce(reduce_func, nlist)

例如,来自以下的输出:

l = [7,4,11,11,14]
print nlist2string(l)

是字符串"hello"

reduce 函数有两个参数,一个用于将列表折叠成单个值的函数,以及一个列表。

作为一个更简单的例子reduce

function add(x,y):
    return x + y

print reduce(add, [1, 4, 3, 10, 5])
//Output: 23
于 2013-03-29T18:48:33.113 回答
0

在 Python 中,字符串文字和数字是不同类型的对象,并且不比较相等。

1 == "1"

返回假。

您正在遍历数字字符串列表,但它不是实际数字列表。

您可以使用 range() 函数(它是 python 内置的)来生成一个数字列表,而不是手动输入它。

于 2013-03-29T18:37:30.227 回答