【发布时间】: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与 Clong一样大(通常为 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