【问题标题】:how do I export my lists into an excel compatible file?如何将我的列表导出到与 Excel 兼容的文件中?
【发布时间】:2011-07-11 17:18:01
【问题描述】:

今天,根据我在这里得到的答案,我编写了这个小代码来创建一个包含 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. 将这两个列表作为列放在制表符分隔 (txt) 文件中,一个并排放置,以便轻松将它们复制粘贴到 Excel 文件中。我查看了 csv 模块,但它似乎只有行的方法。

【问题讨论】:

    标签: python excel python-3.x text-files


    【解决方案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')
    

    【讨论】:

    • @user747465:这应该是一个更合乎逻辑的顺序。这对你有意义吗?干杯!
    • random.shuffle 是我自己尝试的第一件事,但由于我需要强制执行不具有 2 个相同元素连续的约束,所以它不起作用。
    • 很好,我适应了我的原始版本,因为我需要强制执行并且它运行良好。
    【解决方案2】:

    这样的事情应该可以工作: (我针对 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'))
    

    【讨论】:

    • 您的代码给出了错误“TypeError: 'str' does not support the buffer interface”。
    • @user747465:抱歉,我使用的是 Python 2.7。我认为我现在已经为 Python 3 修复了它(但没有检查它)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 2018-10-15
    • 2019-03-25
    • 1970-01-01
    相关资源
    最近更新 更多