我的任务是一次随机合并列表 2 的元素。
例如
list = ["a", "b", "c", "d", "f", "g"]
然后我想输出类似
a;c
b;f
d;g
etc.
其中两个元素的组合是随机的。
如果元素数量是奇数,我只想将最后 3 个元素加在一起。例如,
list = ["a", "b", "c", "d", "f", "g", "h"]
会变成类似的东西
a;c
b;f
d;g;h
etc
到目前为止我有
import random
list = ["a", "b", "c", "d", "f", "g", "h"]
already_seen = []
for i in range(len(list)):
rand = random.choice(list)
if rand not in already_seen:
already_seen.append(rand)
print(rand + ";" + ?)
答案 0 :(得分:1)
您可以将 2 替换为任何其他整数(以获得三元组等)
>>> lst = [2,63,12,13461,13,61,2,12,61,23]
>>> random.shuffle(lst)
>>> [lst[i:i + 2] for i in range(0, len(lst), 2)]
[[13, 2], [61, 23], [2, 12], [13461, 12], [61, 63]]
如果您的列表有奇数个元素,您将在对列表的末尾有一个单例列表。
答案 1 :(得分:1)
这是一个完整的实现,可以生成您想要的格式
from random import shuffle
def combine_elements(my_list):
shuffle(my_list)
if (not len(my_list)%2):
result = [my_list[i]+ ";" + my_list[i+1] for i in range(0,len(my_list)-1,2)]
else:
result = [my_list[i]+ ";" + my_list[i+1] for i in range(0,len(my_list)-4,2)]
result.append((';').join(my_list[-3:]))
return result
list1 = ["a", "b", "c", "d", "f", "g"]
print(combine_elements(list1))
list2 = ["a", "b", "c", "d", "f", "g", "h"]
print(combine_elements(list2))
# Permanently changes the lists
#print(list1)
#print(list2)
结果,也是一个列表,直接打印,但也可以简单地复制到不同的变量中并进行操作。请注意,对 combine_elements
的调用会永久更改您的输入列表。
答案 2 :(得分:0)
df = pd.concat([df, pd.DataFrame(columns = fruits)], axis = 1)
df = df.assign(**df['basket_1'].str.get_dummies(';'))
df = df.assign(**df['basket_2'].str.get_dummies(';') * 2)
df = df.fillna(0)
输出:
data = {'basket_1':['apple;banana;orange', 'apple;banana;mango', 'mango;orange;grapefruit','mango;peach;grapefruit'],
'basket_2':['pineapple;strawberry;peach', 'peach;lemon;guava', 'strawberry;peach;guava', 'apple;lemon;guava']}
df = pd.DataFrame(data)
fruits = np.array(['apple', 'banana', 'orange', 'mango', 'grapefruit', 'kiwi', 'pineapple',
'strawberry', 'peach', 'lemon', 'guava', 'lime'])
req_cols = df.columns.tolist() + fruits.tolist()
df = pd.concat([df, df['basket_1'].str.get_dummies(';'), df['basket_2'].str.get_dummies(';')*2], axis = 1).groupby(level=0, axis=1).sum()
df = df.reindex(req_cols, axis = 1, fill_value = 0)
答案 3 :(得分:0)
类似于@rudolfovic 的回答,但如果列表长度为奇数,则在最后一个索引处有 3 个元素:
lst = ["a", "b", "c", "d", "f", "g", "h"]
random.shuffle(lst)
lsts = [lst[i:i + 2] for i in range(0, len(lst), 2)]
if len(lst) % 2 == 1 and len(lst) > 1:
lsts[-2].extend(lsts.pop())
for sublst in lsts:
print(';'.join(sublst))
输出:
d;b
c;a
g;f;h
答案 4 :(得分:0)
这会给你你想要的输出:
import random
lst = ["a", "b", "c", "d", "f", "g", "h"]
random.shuffle(lst)
for i in range(0,len(lst),2):
if len(lst)==3:
print(lst[0]+';'+lst[1]+';'+lst[2])
break
else:
print(lst[0]+';'+lst[1])
lst.pop(0)
lst.pop(0)
示例输出:
b;f
g;h
a;d;c
这段代码将列表打乱,然后打印前两个元素,如 b;f
然后删除它们,如果列表的长度是奇数,pop
后长度将为 3,因此它将打印3 个元素在一起,如 a;d;c
答案 5 :(得分:0)
由于似乎每个人都在使用 random.shuffle
,这里有一个没有使用它的答案
import random
def shuffle(l):
output = []
for i in range(len(l)):
while i not in output:
n = random.randint(0, len(l)-1)
if n not in output:
output.append(n)
return [l[x] for x in output]
l = ["a", "b", "c", "d", "e", "f"]
shuffled = shuffle(l)
output = [shuffled[i:i+2] for i in range(0, len(shuffled), 2)]
print(output)
输出
[['d', 'f'], ['e', 'a'], ['b', 'c']]