2015-01-09 3 views
-3

Мне нужен список чисел, они должны быть шестнадцатеричными числами. Список должен быть разделен запятыми (или что-нибудь действительно, до тех пор, пока они являются отдельными), чтобы я мог использовать список в качестве входных данных для другой программы.Создание списка с разделителями-запятыми в python

Я хочу начать с 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, но это то, что я не понимаю, и будет иметь изменить все.

Кажется, что, поскольку он работает в основном, несколько настроек будут лучше, чем переписывать то, что я не понимаю.

+5

В этом файле будут _а много_ чисел ... «много», как в _10^24_. Является ли ваш жесткий диск достаточно большим для такого файла? –

+0

«Список, разделенный запятой»: вы имеете в виду строку (содержащую шестнадцатеричные числа)? Список содержит элементы, нет специального разделителя. – Evert

+1

Для удобства существует также функция 'hex()': например, 'hex (5)' дает строку ''0x5''. – Evert

ответ

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, во избежание размещения запятой в самом конце, остается в качестве упражнения.

+0

, который очень близок к тому, что мне нужно, мне просто нужно числа, которые должны быть разделены чем-то, например, запятой. Я выполнил некоторые упражнения, когда он печатает список, разделенный запятой, но я не могу сделать эту работу с числами. я собираюсь просто сдаться, прошло уже больше недели. кажется, так просто сделать счетчик компьютеров, просто сложно записать его. – sfzombie13

+0

Прочитайте немного о форматировании строк, потому что вы выводите строки, а не [необработанные] числа. – 9000

+0

@ sfzombie13 Там _is_ разделитель запятой в строке формата: '"% x, "' –

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 байт для хранения, для хранения файла вам потребуется очень большое количество ТБ.

Говоря иначе: если вы можете обрабатывать 100 миллионов чисел в секунду ...

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

будет принимать 383347862 лет, чтобы закончить.

[edit:] Вы, кажется, не цените, насколько велика 0xffffffffffffffffffff действительно и настаивает на подсчете f s. Рассмотрим это:

>>> 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 с (по сравнению с 10) до 20 f с вы будете экономить 23959241 лет времени выполнения. Те 23 миллиона лет утонули по сравнению с 360 миллионами лет, которые остались (опять же, предположив, что вы можете обрабатывать 100 миллионов номеров в секунду, чего вы не можете).

Смежные вопросы