如何将我的列表导出为Excel兼容文件?

1 投票
2 回答
2208 浏览
提问于 2025-04-16 21:17

今天,我根据这里得到的回答,写了一个小代码来生成一个包含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. 将这两个列表放在一个以制表符分隔的文本文件中,彼此并排放置,以便我可以轻松地复制粘贴到Excel文件里。我查了一下csv模块,但它似乎只提供处理行的方法。

2 个回答

0

像这样的代码应该可以运行:
(我稍微调整了一下你的程序,主要是针对这两个列表,但尽量保持了整体的意思不变)

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'))
1

如果你想要更高效地从你的列表元素中随机获取每个元素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')]

要把你的列表合并在一起,可以在你的大列表名字前面加上 * 星号解包操作符。

>>> 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')

撰写回答