向列表项添加标签以进行打印/导出的最佳选择?

时间:2019-05-07 16:43:22

标签: python python-3.x

我正在尝试将标签添加到从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)是否有更快的速度来替代合并两个列表?我要使用的实际列表很大。

4 个答案:

答案 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))