Как удалить два разных списка кортежей из одной структуры и добавить к файловому объекту?

#python #list #tuples

#python #Список #кортежи

Вопрос:

У меня есть два разных списка кортежей с разной структурой, которые я хочу добавить. Первый, attribute — это список кортежей с каждым значением в одном кортеже в виде строки и всегда с запятой после значения, вот так

 [('id',), ('attr_1',), ('attr_2',), ...]
  

Второй, value — это список кортежей, в котором все значения, соответствующие атрибутам, находятся в одном кортеже и заполнены строками и числами, вот так

 [(111, 222, 333), ('aaa', 'bbb', 'ccc'), ('a1', 'b2', 'c3'), ...]
  

Я хочу связать оба объекта, в результате чего файл будет выводиться следующим образом

 id; attr_1; attr_2; ...
111; aaa; a1; ...
222; bbb; b2; ...
333; ccc; c3; ...
  

Я пытался до сих пор

 attr = (list(sum(attribute, ())) )
attri = ";".join(attr)
  

который отлично работает для attribute списка, но не для value . Есть идеи? Спасибо

Ответ №1:

Используя zip :

 test_tup = [(111, 222, 333), ('aaa', 'bbb', 'ccc'), ('a1', 'b2', 'c3')]
print(list(zip(*test_tup)))
  

ВЫВОД:

 [(111, 'aaa', 'a1'), (222, 'bbb', 'b2'), (333, 'ccc', 'c3')]
  

Записать их вместе, разделенные ; :

 print('; '.join(' '.join(str(x) for x in i) for i in headers))
print('n'.join('; '.join(str(x) for x in i) for i in res))
  

ВЫВОД:

 id; attr_1; attr_2
111; aaa; a1
222; bbb; b2
333; ccc; c3
  

Ответ №2:

Попробуйте это, если вы хотите записать желаемый результат в файл csv:

 import pandas as pd
a = [('id',), ('attr_1',), ('attr_2',), ...]
b = [(111, 222, 333), ('aaa', 'bbb', 'ccc'), ('a1', 'b2', 'c3'), ...]
df = pd.DataFrame({a[i][0] : b[i] for i in range(len(a))}) # length of a and each item inside b must be same
df.to_csv(file_name, sep=';')
  

Комментарии:

1. Есть ли какие-либо преимущества в производительности, гарантирующие использование pandas по сравнению с собственными функциями python?

2. @DillonDavis Другой человек запросил, в результате чего выводится файл . Поскольку более целесообразно сохранить результат в формате, подобном csv, я использовал pandas dataframe.

Ответ №3:

Вы могли бы сделать что-то вроде,

 >>> header
[('id',), ('attr_1',), ('attr_2',)]
>>> x
[(111, 222, 333), ('aaa', 'bbb', 'ccc'), ('a1', 'b2', 'c3')]
>>> ';'.join(x[0] for x in header)
'id;attr_1;attr_2'
>>> print('n'.join(';'.join(str(_) for _ in y) for y in zip(*x)))
111;aaa;a1
222;bbb;b2
333;ccc;c3
  

Ответ №4:

Вы не можете .join int сначала преобразовать их в str s, а затем использовать zip :

 values = [(111, 222, 333), ('aaa', 'bbb', 'ccc'), ('a1', 'b2', 'c3')]
values = [tuple(str(j) for j in i) for i in values]
out = ['; '.join(i) for i in zip(*values)]
print(out) #['111; aaa; a1', '222; bbb; b2', '333; ccc; c3']
  

При желании добавьте out = 'n'.join(out) строку после out = ['; '.join(i) for i in zip(*values)] , если хотите single str .

Ответ №5:

Вы можете выполнить объединение также во втором списке, но вам нужно сделать это для каждого элемента списка. F.пример по составлению списка:

 value_list = [ ";".join(i) for i in value]