Python 如何在linux脚本中从列表中随机选择多个项目?

Python 如何在linux脚本中从列表中随机选择多个项目?,python,perl,awk,sed,scripting,Python,Perl,Awk,Sed,Scripting,在此处输入代码如何在linux脚本中从列表中随机选择多个项目 例如:- A列B列 Itemcode Quantity COM#004 2 COM#005 3 COME001 10 COMT000 3 COMT001 3 COMH000 1 COMH000 1 COM#006 2 CT100H000 1 投入:- 要选择的项目数 例如:-要选择的项目数=6 COME001 COMT000 COM#004 COM#006 C

在此处输入代码如何在linux脚本中从列表中随机选择多个项目

例如:-

A列B列

Itemcode    Quantity
COM#004     2
COM#005     3
COME001     10
COMT000     3
COMT001     3
COMH000     1
COMH000     1
COM#006     2
CT100H000   1
投入:- 要选择的项目数

例如:-要选择的项目数=6

COME001
COMT000
COM#004
COM#006
COMT001
COMH000
选择一组项目后,数量必须减少。应该能够为下一次选择选择项目,直到其数量为零

这是可行的,但我希望股票能够维持。在输出1上:-COME001被拾取,库存显示为9,但在输出2上,它没有被拾取,这没关系,它随机拾取,但库存应保持为9,而不是10

产出1:- $python test.py 挑选:['COM004','COM005','COMH000','COM004','CT100H000','COME001']

剩余存货 COMH000 1 COMT000 3 COMT001 3 CT100H000 0 COM005 2 COM004 0 COM0062 COME0019

产出2:- $python test.py 挑选:['COMH000'、'COMT000'、'COM004'、'COM006'、'COM005'、'COMH000']

剩余存货 COMH000 0 COMT000 2 COMT001 3 CT100H000 1 COM005 2 COM004 1 COM006 1
如果速度不重要,则可以在Python中使用以下方法。数据必须存储在CSV文件中,并每次更新。我假设一个简单的以制表符分隔的文件,如问题所示:

import random, collections, csv

def pick_non_zero(count):
    ditems = collections.defaultdict(int)

    # Read the current stock file in
    with open("stock.csv", "r") as f_input:
        csv_input = csv.reader(f_input, delimiter="\t")
        headers = csv_input.next()

        for item, quantity in csv_input:
            ditems[item] += int(quantity)

    lchoices = []

    for n in range(count):
        # Create a list of items with quantity remaining
        lnon_zero = [item for item, quantity in ditems.items() if quantity > 0]

        if len(lnon_zero) == 0:
            lchoices.append("No more stock")
            break

        # Pick one
        choice = random.choice(lnon_zero)
        # Reduce quantity by 1
        ditems[choice] -= 1
        lchoices.append(choice)

    # Write the updated stock back to the file
    with open("stock.csv", "wb") as f_output:
        csv_output = csv.writer(f_output, delimiter="\t")
        csv_output.writerow(headers)

        for item, quantity in ditems.items():
            csv_output.writerow([item, quantity])

    print "Stock left"

    for item, quantity in ditems.items():
        print "%-10s  %d" % (item, quantity)

    return lchoices

lpicked = pick_non_zero(6)

print
print "Picked:", lpicked
给出以下可能的输出:

Stock left
COMH000     0
COMT000     2
COMT001     3
CT100H000   0
COM#005     3
COM#004     2
COM#006     2
COME001     8

Picked: ['CT100H000', 'COMH000', 'COME001', 'COME001', 'COMH000', 'COMT000']
更新为使用CSV文件。使用Python 2.7进行测试。

您可以使用random.sample进行测试

import random

# Reading in all the lines
with open('input') as f:
    lines = f.readlines()

# Deleting first line
del lines[:1]

# Picking 6 unique list items randomly
print("\n".join(random.sample(lines, 6)))

请参阅。

如果一个项目当前的数量大于1,那么它可以在一个集合中选择多次吗?顺便说一句,对于SO来说,这不是一个好问题。这不是一个解决编程难题的网站,它是一个问答网站,帮助您修复无法正常工作的程序。也许你应该看看。是的,如果一个项目当前的数量大于1,它可以被选择多次例如:-我有完整的项目列表和可用数量。我需要生成从给定列表中挑选的多个项目的随机列表[多重列表]。我需要一个选项来选择每个随机列表中的项目数,直到数量大于零为止,必须从给定列表中选择项目。@PM2Ring:这个问题在PPCG上完全脱离主题,并且在用户发布后已关闭并删除。请不要建议在你一点都不熟悉的网站上发布。这并不是OP想要的。事实上,这样OP就可以真正开始编写代码了。这很公平,尽管在这个阶段,OP是否可以用任何标记的语言编写代码还不清楚。我猜你的代码确实解决了帖子第一行的问题:在循环中每次创建lnon_zero似乎都是低效的,但实际上并不太糟糕,尤其是当项目的大小不是太大时。然而,OP希望代码能够列出不同长度的列表,每个列表包含多个选项;同一项允许在给定列表中多次出现。文件test.in,第28行数据项={item:quantity for item,quantity in items}^语法错误:无效语法[root@xcatmn~]python-版本python 2.6.6[root@xcatmn~]它使用了一个字典压缩,我想这是在Python 2.7中添加的。也可以使用列表压缩甚至循环。有关如何更改它的示例,请参阅。