我如何从 linux 脚本中的列表中随机 select 多个项目?
How do i randomly select more than one item from a list in linux scripting?
enter code here
如何在 linux 脚本中从列表中随机 select 多个项目?
例如:-
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
输入:-
select
的项目数
例如:- 项目数 select = 6
COME001
COMT000
COM#004
COM#006
COMT001
COMH000
一组项目 selected 后,必须减少数量。应该能够为下一个 select 选择项目,直到它的数量变为零。
它有效,但我希望例如维持库存。在输出 1 上:- COME001 被挑选并且库存显示为 9 但在输出 2 上它没有被挑选这没关系它随机挑选但是库存应该保持为 9 而不是 10
输出1:-
$pythontest.py
已选择:['COM#004'、'COM#005'、'COMH000'、'COM#004'、'CT100H000'、'COME001']
剩余库存
COMH000 1
COMT000 3
COMT001 3
CT100H000 0
通讯#005 2
通讯#004 0
通讯#006 2
COME001 9
输出2:-
$pythontest.py
已选择:['COMH000'、'COMT000'、'COM#004'、'COM#006'、'COM#005'、'COMH000']
剩余库存
COMH000 0
COMT000 2
COMT001 3
CT100H000 1个
通讯#005 2
串口#004 1
通讯#006 1
COME001 10
如果速度不重要,可以在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)))
参见https://docs.python.org/2/library/random.html?highlight=random%20sample#random.sample。
enter code here
如何在 linux 脚本中从列表中随机 select 多个项目?
例如:-
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
输入:- select
的项目数例如:- 项目数 select = 6
COME001
COMT000
COM#004
COM#006
COMT001
COMH000
一组项目 selected 后,必须减少数量。应该能够为下一个 select 选择项目,直到它的数量变为零。
它有效,但我希望例如维持库存。在输出 1 上:- COME001 被挑选并且库存显示为 9 但在输出 2 上它没有被挑选这没关系它随机挑选但是库存应该保持为 9 而不是 10
输出1:- $pythontest.py 已选择:['COM#004'、'COM#005'、'COMH000'、'COM#004'、'CT100H000'、'COME001']
剩余库存 COMH000 1 COMT000 3 COMT001 3 CT100H000 0 通讯#005 2 通讯#004 0 通讯#006 2 COME001 9
输出2:- $pythontest.py 已选择:['COMH000'、'COMT000'、'COM#004'、'COM#006'、'COM#005'、'COMH000']
剩余库存 COMH000 0 COMT000 2 COMT001 3 CT100H000 1个 通讯#005 2 串口#004 1 通讯#006 1 COME001 10
如果速度不重要,可以在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)))
参见https://docs.python.org/2/library/random.html?highlight=random%20sample#random.sample。