【问题标题】:How to compare Twitter Ids in python [duplicate]如何在python中比较Twitter ID [重复]
【发布时间】:2018-06-04 17:44:03
【问题描述】:

我正在使用 twitter id,它们是字符串,因为它们非常大。

Twitter 的 api 有一个“Since_id”,我想搜索列表中最早的推文以来的推文。

例如:

tweet_ids = [u'1003659997241401843', u'1003659997241401234234', u'100365999724140136236'] # etc
since_id = min(tweet_ids)

到目前为止min(tweet_ids) 有效,但我想了解它为什么有效,因为我想知道它是否只是偶然地在我提供的少数样本上有效,或者它是否保证始终有效。

编辑:为了澄清我需要获得最低的推文 ID。如果它们是 > 2^32-1 的字符串,因此在 32 位机器上无法在 python 2.7 中表示为整数,我如何获得最低的推文 ID。

如果这很重要,我正在使用 python 2.7

【问题讨论】:

  • 如果保证所有字符串的长度相同,可能使用min(tweet_ids) 而不是min(tweet_ids, key=int) 会稍微快一些。但是速度提升不太重要,您需要某种注释来解释为什么将它们作为字符串进行比较是安全的,否则您的代码对任何读者(包括几个月后的您)来说都是可疑的,所以我会去转换为int
  • 我正在使用 twitter id,它们是字符串,因为它们太大了 这在 Python 中不是问题,它的整数不限于机器字。将 id 表示为整数,您的问题就会消失。
  • 在 Python 2.7 中,您可能希望使用 key=long 而不是 key=int。 Python 2.x 有两种不同的整数类型; int 与 C long 一样大(通常为 32 位),而 long 是一个数字列表,只要你有记忆就可以使用。在 2.7 中,int 值在必要时会自动提升为 long,但如果您更关心清晰度而不是 3.x 可移植性,我认为在这里明确表示是有意义的。
  • 同时,Twitter API 将这些数字作为字符串发送的原因是 JSON 的限制。 JSON 允许用float64 表示所有数字。如果在float64 中插入一个 70 位整数,则会丢失最右边的几位数字,这显然是不可接受的。因此它们将它们作为字符串传递,您可以将其转换为 Python 2.x 中的 long、Python 3.x 中的 int、Scala 中的 BigInt,或者您的语言提供的 JSON 不提供的任何类型。跨度>
  • 像这样的 XY 问题被标记为重复有点愚蠢。甚至在编辑之前,您就可以看到 OP 的问题不在于如何比较字符串。无论如何,上面的 abernert 的 cmets 是该问题的(最好的恕我直言)答案。

标签: python string python-2.7


【解决方案1】:

Python Documentation 开始,这意味着所有字符串,包括您的字符串是大数字序列的情况,都按字典顺序进行比较。

  • 在这种情况下,“较小整数”字符串 2 小于“较大整数”字符串 100
  • 按字典顺序排序的负整数比正整数“更大”。以这种方式比较时,"-1" 大于 "99",因为减号连字符在字典上大于所有数字。
  • 相等的整数"2""02" 在字符串比较方面不一定相等。 "02" 小于 "2" 字符串,因为前导零。

最好把str转成long int,然后比较。如

  • tweet_ids = [long('1003659997241401843'), long('1003659997241401234234'), long('100365999724140136236')]
  • since_id = min(tweet_ids)

由于 JSON 不允许 70 位长的 int,请将最小的 int 转换回 str。将since_id 行替换为

  • since_id = min(tweet_ids, key=int)

【讨论】:

  • 我认为 twitter 使用字符串是因为数字太大而无法表示为整数?
  • 它们可以表示为整数。具有任意精度的大整数和长整数。将它们排序为整数。
  • 我不同意。我正在使用 python 2.7 和谷歌应用引擎。我的猜测是应用程序引擎仍然是 32 位的,所以这意味着我最大的 int 将是 43 亿。这些推文 ID 远大于 40 亿
  • 比较 Python 处理 int 的方式:stackoverflow.com/questions/7604966/…
  • @TerenceChow 它们太大而无法在 JSON 中 表示为整数。这是因为 JSON 明确记录了数字将被视为 float64 值,如果您将 70 位整数存储在 float64 值中,您会丢失最后几位数字。它们不会太大而无法在 Python 中表示为整数,因为 Python 将整数表示为(30 位)数字的列表,因此您可以根据需要保存任意大的数字(直到您内存不足)。
【解决方案2】:

Python 将像比较任何其他字符串一样比较这些字符串;也就是说,它将按字典顺序比较它们。

因此,它会将12 放在2 之前,这可能对您不利。

这是一个函数,它将为您计算代表整数的字符串的最小数值。

# A is an iterable of strings representing integers.
def numerical_min(A):
    cur_min = A[0]
    for x in A[1:]:
        if len(x) < len(cur_min):
            cur_min = x
            continue
        if len(x) > len(cur_min):
            continue
        for m,n in zip(x, cur_min):
            if int(m) < int(n):
                cur_min = x
                break
    return cur_min

【讨论】:

  • 在这种情况下比较这些的最佳方法是什么?
  • @TerenceChow,我添加了一个解决方案,它与表示为字符串的整数的大小无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 2021-11-18
  • 2014-07-23
  • 2019-10-09
  • 2021-01-27
相关资源
最近更新 更多