我正在尝试将标签添加到从sql连接获得的很长的列表中的小型学校项目。该列表例如获取cell1-cell3,然后转到下一个选定的行。它来自用于用户选择的GUI界面,但GUI端传递了所选行项目的列表。
因此,列表的版本要短得多,例如:
my_list = ['apple', 'carrot', 'chicken', 'orange', 'broccoli', 'ham']
labels = ['Fruit', 'Vegatable', 'Meat']
添加在my_list的第n个项目上迭代的标签并附加标签的好方法是什么,这样输出就变成了类似的东西:
Fruit : apple
Vegetable : carrot
Meat : chicken
Fruit : orange
Vegetable : broccoli
Meat : ham
-或-
Fruit Vegatable Meat
apple carrot chicken
orange broccoli ham
我试图创建第二个标签列表,但是它结束了标签列表,并且一旦带有标签的列表用完,就不再继续。 ValueError:太多值无法解包(预期2)
我还尝试了一个非常重复的过程,使用以下方法将它们分为3部分:
print("".join(["".join(my_list[i:i + 3]) for i in range(0, len(my_list), 3)]))
但是我不知道如何获取每个项目的标题。 然后使用一些非常丑陋的方法jsut来获取输出:
for item in (my_list[::3]):
print(str(labels[0]) + "\t" + item)
for item in (my_list[1::3]):
print(str(labels[1]) + "\t" + item)
for item in (my_list[2::3]):
print(str(labels[2]) + "\t" + item)
1)有什么好的方法可以将它们结合起来?
2)是否有更快的速度来替代合并两个列表?我要使用的实际列表很大。
答案 0 :(得分:0)
关于可读性和速度(EDIT):
>>> my_list = ['apple', 'carrot', 'chicken', 'orange', 'broccoli', 'ham']
>>> labels = ['Fruit', 'Vegetable', 'Meat']
>>> [f"{l}: {v}" for l, v in zip(labels*(len(my_list)//len(labels)+1), my_list)]
['Fruit: apple', 'Vegetable: carrot', 'Meat: chicken', 'Fruit: orange', 'Vegetable: broccoli', 'Meat: ham']
其他版本(不创建第二个列表):
>>> L = len(labels)
>>> [f"{labels[i%L]}: {v}" for i, v in enumerate(my_list)]
['Fruit: apple', 'Vegetable: carrot', 'Meat: chicken', 'Fruit: orange', 'Vegetable: broccoli', 'Meat: ham']
基准:
>>> my_list = my_list * 1_000_000
>>> import timeit
>>> timeit.timeit(lambda: [f"{l}: {v}" for l, v in zip(labels*(len(my_list)//len(labels)+1), my_list)], number=10)
5.743572215003951
>>> timeit.timeit(lambda: [f"{labels[i%L]}: {v}" for i, v in enumerate(my_list)], number=10)
8.350919869997597
答案 1 :(得分:0)
一个好的选择是字典:
#from collections import OrderedDict
my_list = ['apple', 'carrot', 'chicken', 'orange', 'broccoli', 'ham']
labels = ['Fruit', 'Vegatable', 'Meat']
length_of_labels = len(labels)
#my_dictionary = OrderedDict()
my_dictionary = {}
for i,l in enumerate(my_list):
my_dictionary[l] = labels[i%length_of_labels]
for d in my_dictionary:
print('{:10} : {:10}'.format(d,my_dictionary[d]))
输出
apple : Fruit
carrot : Vegatable
chicken : Meat
orange : Fruit
broccoli : Vegatable
ham : Meat
该词典将让您致电my_dictionary["Apple"]
,以获取"Apple"
的标签,以及所有其他食物的标签。带有[i%length_of_labels]
的部分可确保如果到达labels
列表的末尾,它将从头开始。
答案 2 :(得分:0)
尝试一下:
>>> my_list = ['apple', 'carrot', 'chicken', 'orange', 'broccoli', 'ham']
>>> labels = ['Fruit', 'Vegatable', 'Meat']
>>> [f'{labels[idx % 3]}\t{value}' for idx, value in enumerate(my_list)]
['Fruit\tapple', 'Vegatable\tcarrot', 'Meat\tchicken', 'Fruit\torange', 'Vegatable\tbroccoli', 'Meat\tham']
答案 3 :(得分:0)
枚举列表,然后使用list1 [x % 3]
每n个项目拆分一个。然后使用.formt
将其格式化为所需的间距。
for idx, value in enumerate(my_list):
i = labels[idx % 3]
j = value
print('{:12} : {:3}'.format(i, j))