我有以下Python函数,
import random
import math
deck = [2,3,4,5,6,7,8,9,10,10,10,10,11]
def draw_card(deck):
card = deck.pop(random.sample(range(len(deck)), 1)[0])
return(card)
print(deck,'\n')
my_draw = draw_card(deck)
print(my_draw, '\n')
print(deck, '\n')
输出低于,
[2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11]
3
[2, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11]
我需要将它转换为R但我知道R中没有等效的Python list.pop函数。我不担心随机选择,因为我可以在R中执行rep
并且能够模拟在R by中绘制卡片,
DrawCard <- function(card){
card <- tail(deck,1)
return(card)
}
此外,我可以通过head(deck, -1)
移除相同的抽取卡,但我不知道如何提供像Python一样的2合1函数,它将同时返回卡值和较短长度的卡片。
请帮忙。
谢谢, Lobbie
答案 0 :(得分:1)
根据您的逻辑,返回list
DrawCard <- function(deck){
card <- tail(deck,1)
remain<-head(deck,9)
return(list(card,remain))
}
cc<-1:10
DrawCard(cc)
更好的逻辑可能是,
DrawCard <- function(deck){
ind<-1:length(deck)
choose<-sample(ind,1)
card<-deck[choose]
remain<-deck[-choose]
return(list(card,remain))
}
附加:回答循环
sum=0
ll<-length(cc)
deck_rem<-cc
for(x in 1:ll){
a<-DrawCard(deck_rem)
deck_rem=a[[2]]
sum=sum+a[[1]]
print(a[[1]])
print(a[[2]])
print(sum)
}
答案 1 :(得分:1)
我不是建议你这样做(返回卡片列表和新牌组是一个更好的主意),但你可以让函数改变全局deck
变量,如下所示:
draw_card <- function(deck){
card <- tail(deck,1)
deck <<- head(deck, length(deck)-1)
return(card)
}
print(deck)
# [1] 2 3 4 5 6 7 8 9 10 10 10 10 11
print(draw_card(deck))
# [1] 11
print(deck)
# [1] 2 3 4 5 6 7 8 9 10 10 10 10
随机抽样(感谢Ben Bolker)和一个适用于任何套牌变量的函数:
draw_card <- function(deck){
s <- sample(length(deck),size=1)
card <- deck[s]
n <- deparse(substitute(deck))
assign(n, deck[-s], envir=globalenv())
return(card)
}