【问题标题】:Printing a string prints 'u' before the string in Python?在Python中打印字符串之前打印'u'?
【发布时间】:2013-10-10 20:05:29
【问题描述】:

'u' 在打印列表中的元素之前?我没有在我的代码中输入 u。

hobbies = []

#prompt user three times for hobbies
for i in range(3):
    hobby = raw_input('Enter a hobby:')
    hobbies.append(hobby)

#print list stored in hobbies
print hobbies

当我运行它时,它会打印列表,但它的格式如下:

Enter a hobby: Painting
Enter a hobby: Stargazing
Enter a hobby: Reading
[u'Painting', u'Stargazing', u'Reading']
None

列表中每个元素之前的那些“u”是从哪里来的?

【问题讨论】:

标签: python unicode printing python-2.x


【解决方案1】:

如果要将 unicode 转换为字符串。你可以简单地使用 str(unicodedString) 或 unicode(normalString) 用于其他方式转换

代码

hobbies = []

#prompt user three times for hobbies
for i in range(3):
    hobby = raw_input('Enter a hobby:')
    # converting the normal string to unicode
    hobbies.append(unicode(hobby))

# Printing the unicoded string
print("Unicoded string")
print(hobbies)
hobbies = [str(items) for items in hobbies]

# Printing the converted string
print("Normal string from unicoded string")
print(hobbies)

输出

Enter a hobby:test1
Enter a hobby:Test2
Enter a hobby:Test3

Unicoded string
[u'test1', u'Test2', u'Test3']

Normal string from unicoded string
['test1', 'Test2', 'Test3']

【讨论】:

    【解决方案2】:

    我认为您实际上对此感到惊讶的是,打印单个字符串与打印字符串列表的作用不同——不管它们是否是 Unicode,这都是正确的:

    >>> hobby1 = u'Dizziness'
    >>> hobby2 = u'Vértigo'
    >>> hobbies = [hobby1, hobby2]
    >>> print hobby1
    Dizziness
    >>> print hobbies
    [u'Dizziness', u'V\xe9rtigo']
    

    即使没有u,你也会得到那些额外的引号,更不用说反斜杠转义了。如果你用 str 字节字符串而不是 unicode 字符串尝试同样的事情,你仍然会有引号和转义符(另外,如果你的源文件和终端有不同的编码,你可能会有 mojibake 字符......但忘记了部分)。


    在 Python 中,每个对象都可以有两种不同的表示形式:最终用户友好的表示 str 和程序员友好的表示 repr。对于字节字符串,这些表示分别是Painting'Painting'。对于 Unicode 字符串,它们是 Paintingu'Painting'

    print 语句使用str,因此print hobby1 打印出Painting,不带引号(或u,如果它是Unicode)。

    但是,列表的str 使用其每个元素的repr,而不是str。因此,当您打印 hobbies 时,每个元素都有引号(如果是 Unicode,则为 u)。

    起初这可能看起来很奇怪,但这是一个有意的设计决定,一旦你习惯了它就会变得有意义。并且打印出[foo, bar, baz] 会产生歧义——这是一个包含三个字符串的列表,还是包含两个字符串的列表,其中一个字符串的中间有一个逗号?但是,更重要的是,列表已经不是用户友好的东西,无论您如何打印它。 My hobbies are [Painting, Stargazing] 看起来和 My hobbies are ['Painting', 'Stargazing'] 一样丑陋。当您想向最终用户显示列表时,您总是希望以某种有意义的方式明确地格式化它。

    通常,你想要的就这么简单:

    >>> print 'Hobbies:', ', '.join(hobbies)
    Hobbies: Painting, Stargazing
    

    或者,对于 Unicode 字符串:

    >>> print u'Hobbies:', u', '.join(hobbies)
    Hobbies: Painting, Stargazing
    

    【讨论】:

    • 你一定是有史以来最快的打字员!我看过的最后五个问题都有像这样的长答案!
    • 完美。正是我正在寻找的答案!
    • @SethMMorton:我的打字速度很快。而且,每当我必须等待编译或测试运行或其他需要足够长的时间来烦人,但不足以回答新问题或玩快速游戏或休息时,我倾向于去返回并重新编辑坐在我面前的答案。如果 SO 显示完整的编辑历史记录而不是折叠,您会感到惊讶……
    【解决方案3】:

    您不是在打印字符串,而是在打印包含字符串的列表的表示形式。

    for hobby in hobbies:
      print hobby
    

    【讨论】:

      【解决方案4】:

      “u”不是字符串的一部分,但表示该字符串是一个 unicode 字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多