【问题标题】:Removing u in list在列表中删除 u
【发布时间】:2012-04-04 02:42:05
【问题描述】:

我已经阅读了删除列表中的字符“u”,但我使用的是谷歌应用引擎,但它似乎不起作用!

def get(self):
    players = db.GqlQuery("SELECT * FROM Player")
    print players
    playerInfo  = {}

    test = []

    for player in players:
        email =  player.email
        gem =  str(player.gem)
        a = "{email:"+email + ",gem:" +gem +"}"

        test.append(a)


    ast.literal_eval(json.dumps(test))
    print test

最终输出:

[u'{email:test@gmail.com,gem:0}', u'{email:test,gem:0}', u'{email:test,gem:0}', u'{email:test,gem:0}', u'{email:test,gem:0}', u'{email:test1,gem:0}']

【问题讨论】:

  • 字符“u”不在列表中,它在 unicode 字符串的 repr 中,如果您尝试 print 整个列表,则会打印出来。
  • u 表示 Unicode 字符串。列表包含 Unicode 字符串本身似乎不是问题,那么您的实际问题是什么?
  • 代码ast.literal_eval(json.dumps(test))计算一个值,然后将其丢弃。

标签: python google-app-engine unicode


【解决方案1】:

'u' 是字符串外部表示的一部分,这意味着它是 Unicode 字符串而不是字节字符串。它不在字符串中,它是类型的一部分。

例如,您可以使用相同的语法创建新的 Unicode 字符串文字。例如:

>>> sandwich = u"smörgås"
>>> sandwich
u'sm\xf6rg\xe5s'

这将创建一个新的 Unicode 字符串,其值为瑞典语中的三明治。您可以看到非英文字符由它们的 Unicode 代码点表示,ö 是 \xf6,å 是 \xe5。 'u' 前缀出现在您的示例中,表示此字符串包含 Unicode 文本。

要摆脱这些,您需要将 Unicode 字符串编码为某种面向字节的表示形式,例如 UTF-8。您可以使用例如:

>>> sandwich.encode("utf-8")
'sm\xc3\xb6rg\xc3\xa5s'

这里,我们得到一个没有前缀'u'的新字符串,因为这是一个字节字符串。它包含表示 Unicode 字符串字符的字节,由于 UTF-8 编码的奇妙,瑞典字符会产生多个字节。

【讨论】:

  • 不要混淆 Unicode 字符串(内存中的一个对象)和它的文本表示(可以用来在 Python 源代码中指定对象)。考虑print(sandwich) 与print(repr(sandwich))。不要将文本编码为字节。
【解决方案2】:
arr = [str(r) for r in arr]

这基本上将所有元素转换为字符串。因此删除了编码。因此,代表编码的 u 被删除 会轻松高效地完成工作

【讨论】:

  • 虽然这段代码可能有助于解决问题,但它并没有解释为什么和/或如何回答问题。提供这种额外的背景将显着提高其长期教育价值。请edit您的答案添加解释,包括适用的限制和假设。
  • 并使用 StackOverflow 的代码格式化标记来格式化您的 sn-ps ;)
【解决方案3】:

u 表示字符串是 unicode。将所有字符串转换为 ascii 以摆脱它:

a.encode('ascii', 'ignore')

【讨论】:

    【解决方案4】:

    u'AB' 只是相应 Unicode 字符串的文本表示。以下是创建完全相同的 Unicode 字符串的几种方法:

    L = [u'AB', u'\x41\x42', u'\u0041\u0042', unichr(65) + unichr(66)]
    print u", ".join(L)
    

    输出

    AB, AB, AB, AB
    

    内存中没有u''。它只是在 Python 2 中表示 unicode 对象的方式(您将如何在 Python 源代码 中编写 Unicode 字符串文字)。默认情况下,print L 等价于 print "[%s]" % ", ".join(map(repr, L)),即为每个列表项调用 repr() function:

    print L
    print "[%s]" % ", ".join(map(repr, L))
    

    输出

    [u'AB', u'AB', u'AB', u'AB']
    [u'AB', u'AB', u'AB', u'AB']
    

    如果您在 REPL 中工作,则使用可自定义的 sys.displayhook,默认情况下在每个对象上调用 repr():

    >>> L = [u'AB', u'\x41\x42', u'\u0041\u0042', unichr(65) + unichr(66)]
    >>> L
    [u'AB', u'AB', u'AB', u'AB']
    >>> ", ".join(L)
    u'AB, AB, AB, AB'
    >>> print ", ".join(L)
    AB, AB, AB, AB
    

    不要编码为字节。 Print unicode directly.


    在您的具体情况下,我会创建一个 Python 列表并使用 json.dumps() 对其进行序列化,而不是使用字符串格式来创建 JSON 文本:

    #!/usr/bin/env python2
    import json
    # ...
    test = [dict(email=player.email, gem=player.gem)
            for player in players]
    print test
    print json.dumps(test)
    

    输出

    [{'email': u'test@gmail.com', 'gem': 0}, {'email': u'test', 'gem': 0}, {'email': u'test', 'gem': 0}, {'email': u'test', 'gem': 0}, {'email': u'test', 'gem': 0}, {'email': u'test1', 'gem': 0}]
    [{"email": "test@gmail.com", "gem": 0}, {"email": "test", "gem": 0}, {"email": "test", "gem": 0}, {"email": "test", "gem": 0}, {"email": "test", "gem": 0}, {"email": "test1", "gem": 0}]
    

    【讨论】:

    • 谢谢,没有转换或编码我直接用它作为字典中的键。
    【解决方案5】:
    [u'{email:test@gmail.com,gem:0}', u'{email:test,gem:0}', u'{email:test,gem:0}', u'{email:test,gem:0}', u'{email:test,gem:0}', u'{email:test1,gem:0}']
    

    'u' 表示 unicode 字符。我们可以在最终列表元素上使用 map 函数轻松删除它

    map(str, test)
    

    另一种方法是将其附加到列表中

    test.append(str(a))
    

    【讨论】:

    • 这基本上复制了一个现有的答案stackoverflow.com/a/39771186/874188
    • 嘿@tripleee 尝试将 timeit 用于两种解决方案。您将能够看到差异。地图方法更快。并且test.append(str(a)) 正在同时创建列表,而不是在创建列表后迭代列表,从而节省时间。
    【解决方案6】:

    请使用map()python函数。

    输入:如果是值列表

    索引 = [u'CARBO1004' u'CARBO1006' u'CARBO1008' u'CARBO1009' u'CARBO1020']

    encoded_string = map(str, index)
    

    输出:['CARBO1004', 'CARBO1006', 'CARBO1008', 'CARBO1009', 'CARBO1020']

    对于单个字符串输入:

    index = u'CARBO1004'
    # Use Any one of the encoding scheme.
    index.encode("utf-8")  # To utf-8 encoding scheme
    index.encode('ascii', 'ignore')  # To Ignore Encoding Errors and set to default scheme
    

    输出:'CARBO1004'

    【讨论】:

      【解决方案7】:

      您不是“从列表中删除字符 'u'”,而是对 Unicode 字符串进行编码。 事实上,您拥有的字符串非常适合大多数用途;你只需要在输出它们之前对它们进行适当的编码。

      【讨论】:

      • 你不需要编码一个 Unicode 字符串;你可以直接打印print(unicode_string),example
      • 取决于你将它输出到哪里。
      • 显然,尽管默认仍然是:使用 Unicode 在 Python 中处理文本。除非必要,否则不要编码为字节(my answer shows that it is not necessary)——我相信你知道 Unicode 三明治的概念
      【解决方案8】:

      对于 python 数据集,您可以使用索引。

      tmpColumnsSQL = ("show columns in dim.date_dim")
      hiveCursor.execute(tmpColumnsSQL)
      columnlist = hiveCursor.fetchall()
      
      for columns in jayscolumnlist:
          print columns[0]
      
      for i in range(len(jayscolumnlist)):    
          print columns[i][0])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-10
        • 1970-01-01
        • 2020-12-30
        • 1970-01-01
        • 1970-01-01
        • 2017-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多