【问题标题】:Merge elements in a list, if they are in a certain unicode range合并列表中的元素,如果它们在某个 unicode 范围内
【发布时间】:2015-10-15 14:12:14
【问题描述】:

假设我有以下列表

['\U0001f680', '\U0001f618', '\U0001f44d\U0001f3fe', '\U0001f1e6', '\U0001f1ee']

现在我想合并两个连续的元素,如果两个元素都在U+1F1E6U+1F1FF的范围内,那么结果列表应该是

['\U0001f680', '\U0001f618', '\U0001f44d\U0001f3fe', '\U0001f1e6\U0001f1ee']

所以其实有两个问题:

  1. 如何检查 unicode 是否在某个范围内?将 unicode 转换为代码点并进行比较?
  2. 如何有效地比较并从中创建新列表?一些带有列表理解的 Pythonic 方式?

顺便说一句,我正在运行 Python 3.5。

【问题讨论】:

  • 对于 2。我会使用 itertools.combinations。
  • @Hashirun 你能确定字符串总是单个字符/最多 2 个字符吗?
  • @AnandSKumar 他们列表中的一项看起来可能是 2 '\U0001f44d\U0001f3fe'
  • 所以我认为我们需要定义该列表中某个元素在某个 unicode 范围内的含义。对于单个代码点,定义和检查很明显,但是包含多个代码点的 unicode 对象呢?每个代码点都应该在范围内吗?
  • 如果一个元素有多个代码点,那么它可以被忽略。所以应该只比较单个代码点。

标签: python list unicode list-comprehension


【解决方案1】:

我不太熟悉 unicode 来理解您当前对范围的请求。它没有尽可能简洁,但我尝试解释元素包含多个字符的情况。我还给出了任意的 unicode 范围。希望这会有所帮助。

a = ['\U0001f680', '\U0001f618', '\U0001f44d\U0001f3fe', '\U0001f1e6', '\U0001f1ee']
aa = {x: ord(x.decode('unicode-escape')) if x.count('\\') < 2 else 1 for x in a}

low = 127460
high = 127475

[(y,x) if (high >= aa[x] >= low and high >= aa[y] >= low) else y for x,y in zip(aa.keys()[1:],aa.keys()[:-1])]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 2021-08-27
    • 2015-06-23
    • 2020-12-30
    • 2014-03-25
    • 2018-06-18
    • 2020-05-06
    相关资源
    最近更新 更多