如何在 Python 中的单个列表中随机合并元素?

时间:2021-05-27 21:22:58

标签: python python-3.x

我的任务是一次随机合并列表 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 + ";" + ?)

6 个答案:

答案 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']]
相关问题