在python中创建逗号分隔的列表

时间:2015-01-09 15:21:04

标签: python hex

我需要一个数字列表,它们需要是十六进制数字。列表需要用逗号分隔(或者任何真正的,只要它们是分开的),这样我就可以使用该列表作为另一个程序的输入。

我想从0xffffffffff开始,然后转到0xffffffffffffffffffff,将每个数字打印到文本文件,然后打印一个逗号(分隔符),然后打印下一个数字等。我当前计算的代码,创建文件和输入数字。

问题是它是十进制表示法,而不是十六进制,它没有分隔符。这就是我所拥有的:

#!/usr/bin/python

#count in hex from 10 f's to 20 f's and write to comma 
#delimited file to create a dictionary

def count_hex():
    x = 0xffffffffff
    while x <= 0xffffffffffffffffffff:
       x += 0x1
        s = str(x)
        s.upper()
        with open("dictionary.txt", "a") as diction:
            diction.write(s)

count_hex()

我通过插入分隔符来玩它,甚至找到了一个说我必须使用导入CSV的地方,但这是我不理解的东西,而且必须改变一切。

似乎因为它主要是工作,所以进行一些调整比重写我不理解的东西更好。

2 个答案:

答案 0 :(得分:2)

首先,每次要在其中写入数字时重新打开文件。这很慢。 然后,您忘记将数字格式化为十六进制,忘记输入实际的逗号!

def writeHex(start, stop, filename):
  with open(filename, "w") as output:
    for number in xrange(start, stop):
      output.write("%x, " % number)  # writes smth like "ffffff,"

writeHex(0xfffff, 0x100000000000000000000000, "dictionary.txt")

请注意,所有数字都写在一行中,并且在最后一个数字后面有一个逗号。如果/在需要的地方添加“\ n”并添加类似is_first_number的变量以避免逗号放置在最后,则留作练习。

答案 1 :(得分:2)

您将遇到的根本问题是数字太多了:

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 0xffffffffffffffffffff
1208925819614629174706175L
>>> 0xffffffffff
1099511627775L
>>> 0xffffffffffffffffffff - 0xffffffffff
1208925819613529663078400L
>>> GB = 1024 ** 3
>>> GB
1073741824
>>> (0xffffffffffffffffffff - 0xffffffffff) / GB
1125899906841600L
>>> TB = 1024 ** 4
>>> (0xffffffffffffffffffff - 0xffffffffff) / TB
1099511627775L
>>>

即。如果每个数字只需要1个字节来存储,则需要非常大量的TB来存储文件。

换句话说:如果你每秒可以处理1亿个数字......

>>> (0xffffffffffffffffffff - 0xffffffffff) / (100 * 10**6)
12089258196135296L
>>> _ / (60 * 60 * 24 * 365)
383347862L
>>>

完成需要383347862年。

[编辑:]你似乎不理解0xffffffffffffffffffff到底有多大并坚持计算f。考虑一下:

>>> for i in range(10, 21):
...     lowf = '0x' + 'f' * i
...     print 'from %22s to 0xffffffffffffffffffff' % lowf,
...     low = int(lowf, 16)
...     print  ((0xffffffffffffffffffff - low) / (100 * 10**6)) / (60 * 60 * 24 * 365), 'years'
...
from           0xffffffffff to 0xffffffffffffffffffff 383347862 years
from          0xfffffffffff to 0xffffffffffffffffffff 383347862 years
from         0xffffffffffff to 0xffffffffffffffffffff 383347862 years
from        0xfffffffffffff to 0xffffffffffffffffffff 383347861 years
from       0xffffffffffffff to 0xffffffffffffffffffff 383347839 years
from      0xfffffffffffffff to 0xffffffffffffffffffff 383347497 years
from     0xffffffffffffffff to 0xffffffffffffffffffff 383342013 years
from    0xfffffffffffffffff to 0xffffffffffffffffffff 383254271 years
from   0xffffffffffffffffff to 0xffffffffffffffffffff 381850410 years
from  0xfffffffffffffffffff to 0xffffffffffffffffffff 359388621 years
from 0xffffffffffffffffffff to 0xffffffffffffffffffff 0 years

即。通过仅考虑19 f s(从10开始)到20 f s,您将节省23959241年的执行时间。与剩下的3.6亿年相比,这2300万年被淹死了(再次假设你每秒可以处理1亿个数字 - 你可以这样做)。