Как убрать два разных списка кортежей в одну структуру и добавить в файл объект? - PullRequest
0 голосов
/ 06 марта 2019

У меня есть два разных списка кортежей с разной структурой, которые я хочу добавить. Первый, 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. Есть идеи? Спасибо

Ответы [ 5 ]

3 голосов
/ 06 марта 2019

Использование 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
1 голос
/ 06 марта 2019

Вы не можете .join int с, вы должны сначала преобразовать их в str, затем использовать 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)], если хотите одиночный str.

1 голос
/ 06 марта 2019

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

>>> 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
1 голос
/ 06 марта 2019

Попробуйте, если хотите записать желаемый вывод в файл 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=';')
0 голосов
/ 06 марта 2019

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

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