【问题标题】:How do i randomly select more than one item from a list in linux scripting? [closed]如何从 linux 脚本的列表中随机选择多个项目? [关闭]
【发布时间】:2015-10-08 12:48:32
【问题描述】:

enter code here如何在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:- $蟒蛇测试.py 选择:['COM#004', 'COM#005', 'COMH000', 'COM#004', 'CT100H000', 'COME001']

存货 COMH000 1 COMT000 3 COMT001 3 CT100H000 0 COM#005 2 COM#004 0 COM#006 2 COME001 9

输出 2:- $蟒蛇测试.py 选择:['COMH000', 'COMT000', 'COM#004', 'COM#006', 'COM#005', 'COMH000']

存货 COMH000 0 COMT000 2 COMT001 3 CT100H000 1 COM#005 2 COM#004 1 COM#006 1 COME001 10

【问题讨论】:

  • 如果一个item当前的数量>1,是否可以在一组中多次选择?
  • 顺便说一句,这对 SO 来说不是一个好问题。这不是一个编程挑战网站,它是一个问答网站,可帮助您修复无法正常运行的程序。也许你应该看看Programming Puzzles & Code Golf
  • 可以,如果一个item当前的数量>1,可以多次选择
  • 例如:- 我有可用数量的完整项目列表。我需要生成从给定列表中挑选的多个项目的随机列表 [多个列表]。我需要一个选项来选择每个随机列表的项目数,直到数量大于零,必须从给定列表中挑选项目。
  • @PM2Ring:这个问题在 PPCG 上完全是题外话,自用户发布以来已被关闭和删除。请不要建议在您完全不熟悉的网站上发帖。

标签: python perl awk sed scripting


【解决方案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 测试。

【讨论】:

  • 它确实似乎在循环中每次创建lnon_zero 效率低下,但实际上并不算太糟糕,特别是如果items 的大小不是太大的话。但是,OP 希望代码吐出各种长度的列表,每个列表包含多个选择;同一项目允许在给定列表中多次出现。
  • 文件“test.in”,第 28 行 ditems = {项目:项目数量,项目数量} ^ SyntaxError:无效语法
  • [root@xcatmn ~]# python --version Python 2.6.6 [root@xcatmn ~]#
  • 它使用字典压缩,我认为这是在 Python 2.7 中添加的。也可以使用列表压缩甚至循环。
  • 请参阅this post 了解如何更改它的示例。
【解决方案2】:

您可以为此使用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)))

https://docs.python.org/2/library/random.html?highlight=random%20sample#random.sample

【讨论】:

  • 这不符合 OP 的要求。
  • 确实如此,也许 OP 可以真正开始编写代码。
  • 很公平(尽管在这个阶段仍然不清楚 OP 是否可以使用任何标记语言进行编码)。我猜你的代码确实解决了帖子第一行中的问题。 :)
猜你喜欢
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多