Как мне экспортировать мои списки в Excel-совместимый файл? - PullRequest
1 голос
/ 11 июля 2011

Сегодня на основе полученных ответов я написал этот небольшой код для создания случайного списка из 16 элементов.

import random

sources = ['Prone', 'Supine', 'Halfway', 'HalfInv']
result = [random.choice(sources)]
repeats = 0
fail = 0

while len(result) < 16:
    elem = random.choice(sources)
    repeats = result.count(elem)
    print(repeats)
    if (elem != result[-1]) & (repeats < 4):
        result.append(elem)
    else:
        fail = fail + 1
        print(fail)
        if fail > 100:
            result = [random.choice(sources)]

print(result)

Теперь я хотел бы сделать следующее: 1.создать 2 случайных списка, называя их по-разному (как мне сделать это на основе счетчика цикла for?) 2. поместить эти 2 списка в виде столбцов в файле с разделителями табуляции (txt), один рядом с другим, чтобы легко скопировать и вставить ихв файле Excel.Я посмотрел в модуль CSV, но, похоже, есть только методы для строк.

Ответы [ 2 ]

1 голос
/ 11 июля 2011

Если вы ищете более эффективный способ получить случайно упорядоченный список из 4 элементов списка из источников, попробуйте random.shuffle(list):

>>> import random
>>> random.seed()
>>> sources = ['Prone', 'Supine', 'Halfway', 'HalfInv']
>>> copy1 = sources * 4
>>> copy2 = sources * 4
>>> copy1 == copy2
True
>>> random.shuffle(copy1)
>>> random.shuffle(copy2)
>>> copy1 == copy2
False
>>> copy1
['HalfInv', 'Prone', 'Halfway', 'Supine', 'Prone', 'Halfway', 'Prone', 'Supine', 'Prone', 'HalfInv', 'HalfInv', 'Halfway', 'Supine', 'Halfway', 'HalfInv', 'Supine']
>>> copy2
['Prone', 'Halfway', 'Prone', 'Prone', 'HalfInv', 'Halfway', 'Halfway', 'HalfInv', 'Supine', 'HalfInv', 'Halfway', 'Supine', 'Prone', 'Supine', 'HalfInv', 'Supine']

Далее, вы хотите создать и назвать списки на основе счетчика циклов ... Я бы рекомендовал против этого. Вместо этого просто добавляйте свои случайные списки в список по одному, и вы можете индексировать их в порядке добавления.

>>> n = 2 # number of random lists you want
>>> rand_lists = [] # A list for holding your randomly generated lists
>>> for i in range(n):
    sources_copy = sources * 4
    random.shuffle(sources_copy)
    rand_lists.append(sources_copy)

Но это все еще оставляет вас с проблемой, что ваши данные находятся в двух отдельных списках. Чтобы исправить это, вы хотите функцию zip(). Он объединяет каждый элемент в списке 1 со своим соответствующим индексированным элементом в списке 2, образуя кортеж для каждого индекса. Это может быть сделано с произвольным числом последовательностей.

>>> list1 = [1,2,3,4,5]
>>> list2 = ['a','b','c','d','e']
>>> zip(list1, list2)
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')]

Чтобы сжать ваши списки в списке, используйте оператор * star unpacking перед именем вашего мета-списка.

>>> my_data = zip(*rand_lists)

Теперь вы хотите вывести в CSV-файл; достаточно просто написать свою собственную функцию CSV. Помните, что разделители столбцов имеют запятые, разделители строк - это новые строки.

def out_csv(mydata, filename):
    with open(filename, 'w') as out_handle:
        for line in mydata:
            out_handle.write(','.join(line) + '\n')

Отсюда просто передайте комбо вашего сжатого списка в функцию out_csv и убедитесь, что ваше имя файла имеет расширение .csv. Excel может изначально читать файлы .csv, поэтому вам не нужно выполнять копирование.

Вот последний шаг:

>>> out_csv(my_data, 'my_name.csv')
0 голосов
/ 11 июля 2011

Что-то вроде этого должно работать: (Я немного подправил вашу программу для 2 списков, но попытался сохранить общий "смысл" одинаковым)

import random

sources = ['Prone', 'Supine', 'Halfway', 'HalfInv']
#result = [random.choice(sources)]
result = {1:[], 2:[]}
#repeats = 0
#fail = 0

for part in result:
    fail = 0
    repeats = 0
    while len(result[part]) < 16:
        elem = random.choice(sources)
        repeats = result[part].count(elem)
        print(repeats)
        if (not result[part]) or ((elem != result[part][-1]) & (repeats < 4)):
            result[part].append(elem)
        else:
            fail = fail + 1
            print(fail)
            if fail > 100:
                result[part] = []

print(result)



with open('somefile.csv','wb') as f:
    #f.write('\r\n'.join('%s\t%s' % (a,b) for a, b in zip(result[1], result[2])))
    f.write(bytes('\r\n'.join('%s\t%s' % (a,b) for a, b in zip(result[1], result[2])), 'UTF-8'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...