Python为给定的键随机化值,如果有任何重复的键,则再次ranzomize

2024-10-01 07:28:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是以下随机值:

dict_positionxy = {'a difficult anglethe left':{'y':random.randrange(43,54), 'x':random.randrange(0,6)},
                   'a difficult anglethe right':{'y':random.randrange(14,25), 'x':random.randrange(0,6)},
                   'long rangeN/A': {'y':random.randrange(0,68), 'x':random.randrange(40,52)},
                   'long rangethe centre':{'y':random.randrange(0,68), 'x':random.randrange(28,40)},
                   'long rangethe left': {'y':random.randrange(54,68), 'x':random.randrange(0,24)},
                   'long rangethe right':{'y':random.randrange(0,14), 'x':random.randrange(0,24)},
                   'outside the boxN/A':{'y':random.randrange(14,54), 'x':random.randrange(16,28)},
                   'penaltyN/A':{'y':random.randrange(36), 'x':random.randrange(8)},
                   'the boxthe centre':{'y':random.randrange(25,45), 'x':random.randrange(0,6)},
                   'the boxthe left':{'y':random.randrange(41,54), 'x':random.randrange(0,16)},
                   'the boxthe right':{'y':random.randrange(14,22), 'x':random.randrange(0,16)},
                   'the six yard boxthe left': {'y':random.randrange(33,43), 'x':random.randrange(4,6)},
                   'the six yard boxthe right':{'y':random.randrange(25,33), 'x':random.randrange(4,6)},
                   'very close rangeN/A':{'y':random.randrange(25,43), 'x':random.randrange(0,4)}}

为了填充我的X/Y栅格值,如下所示:

df_temp_shots['PositionXY'] = df_temp_shots['Position'].map(dict_positionxy)

问题是某些事件键会重复

例如,如果两个目标具有相同的键“theboxtheleft”,它们将获得相同的值,这是不希望的,因为它们将绘制在同一点上


那么,我如何再次随机化任何重复的值,对于每个键,总是在所需范围内得到唯一的值


Tags: therightrandomleftdictlongdifficultsix
2条回答

注意:此答案使用eval

您可以尝试使用。改为应用。这样,它将迭代所有行并应用不同的随机值。在这个解决方案中,我使用eval()在调用存储在dict中的值时计算表达式。请注意,这些值现在存储为字符串

# sample dataframe
df = pd.DataFrame({'Position': ['A', 'A']})

dict_position = {'A': "{'x': np.random.randint(40, 60), 'y': np.random.randint(40, 60)}"}
df.Position.apply(lambda x: eval(dict_position.get(x)))

这将为您提供以下结果:

    Position
0   {'x': 43, 'y': 51}
1   {'x': 48, 'y': 49}

其他方法可以是定义函数,或者直接在lambda函数中列出所有条件

不依赖于eval的改进解决方案:

df = pd.DataFrame({'Position': ['A', 'A']})

dict_position = {'A': [[40, 60], [80, 90]]}

def dict_pos_xy(pos):
    return {'y':np.random.randint(pos[0][0], pos[0][1]), \
            'x':np.random.randint(pos[1][0], pos[1][1])}

df.Position.apply(lambda x: dict_pos_xy(dict_position.get(x)))

相关问题 更多 >