Python(intertools?)迭代两个相关列表

时间:2018-11-02 16:16:27

标签: python

我有2个相关的列表,我想阅读,整理和输出3列:

参考(id)列表为:NAMES_LIST = [a,b,c,...,z]

属性列表如下:前两个值“属于” id列表的第一个值,后两个值属于id列表的第二个值,等等...:

ATTRIBUTES_LIST =  [a_Var1 ,a_Var2,
                    b_Var1, b_Var2,
                    c_Var1, c_Var2,
                    ......
                    z_Var1, z_Var2]

我想编写一个Python代码(使用intertools?)来打印3列:

Names   Var1    Var2
-----   ------  ------
a       a_Var1  a_Var2
b       b_Var1  b_Var2
c       c_Var1  c_Var2
.       ......  ......
z       z_Var1  z_Var2

预先感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

这是一个示例,基于您在问题中提供的数据格式,使用纯Python:

# Data
NAMES_LIST = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
ATTRIBUTES_LIST =  ['a_Var1', 'a_Var2', 'b_Var1', 'b_Var2', 'c_Var1', 'c_Var2', 'd_Var1', 'd_Var2', 'e_Var1', 'e_Var2', 'f_Var1', 'f_Var2', 'g_Var1', 'g_Var2', 'h_Var1', 'h_Var2', 'i_Var1', 'i_Var2', 'j_Var1', 'j_Var2', 'k_Var1', 'k_Var2', 'l_Var1', 'l_Var2', 'm_Var1', 'm_Var2', 'n_Var1', 'n_Var2', 'o_Var1', 'o_Var2', 'p_Var1', 'p_Var2', 'q_Var1', 'q_Var2', 'r_Var1', 'r_Var2', 's_Var1', 's_Var2', 't_Var1', 't_Var2', 'u_Var1', 'u_Var2', 'v_Var1', 'v_Var2', 'w_Var1', 'w_Var2', 'x_Var1', 'x_Var2', 'y_Var1', 'y_Var2', 'z_Var1', 'z_Var2']

# Manipulating data
ATTRIBUTES_LIST = [ATTRIBUTES_LIST[i:i+2] for i in range(0, len(ATTRIBUTES_LIST), 2)]
output = ["  ".join([char, "    " + var[0], var[1]]) for char, var in list(zip(NAMES_LIST, ATTRIBUTES_LIST))]

# Printing result
print("Names  Var1   Var2")
print("-----  -----  -----")
for elem in output:
    print(elem)

输出:

Names  Var1   Var2
-----  -----  -----
a      a_Var1  a_Var2
b      b_Var1  b_Var2
c      c_Var1  c_Var2
d      d_Var1  d_Var2
e      e_Var1  e_Var2
f      f_Var1  f_Var2
g      g_Var1  g_Var2
h      h_Var1  h_Var2
i      i_Var1  i_Var2
j      j_Var1  j_Var2
k      k_Var1  k_Var2
l      l_Var1  l_Var2
m      m_Var1  m_Var2
n      n_Var1  n_Var2
o      o_Var1  o_Var2
p      p_Var1  p_Var2
q      q_Var1  q_Var2
r      r_Var1  r_Var2
s      s_Var1  s_Var2
t      t_Var1  t_Var2
u      u_Var1  u_Var2
v      v_Var1  v_Var2
w      w_Var1  w_Var2
x      x_Var1  x_Var2
y      y_Var1  y_Var2
z      z_Var1  z_Var2

随时问任何问题或您是否需要澄清。

答案 1 :(得分:1)

您不需要itertools进行分组...

NAMES_LIST = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']

ATTRIBUTES_LIST = [
     'a_var1', 'a_var2',
     'b_var1', 'b_var2',
     'c_var1', 'c_var2',
     'd_var1', 'd_var2',
     'e_var1', 'e_var2',
     'f_var1', 'f_var2',
     'g_var1', 'g_var2',
     'h_var1', 'h_var2'
     ]

num_items = min(int(len(ATTRIBUTES_LIST)/2), len(NAMES_LIST)) # this is just to be safe.

b = [(NAMES_LIST[x], (ATTRIBUTES_LIST[2*x], ATTRIBUTES_LIST[2*x+1])) for x in range(num_items)]
print(b)

以上返回以下输出:

[('a', ('a_var1', 'a_var2')), ('b', ('b_var1', 'b_var2')), ('c', ('c_var1', 'c_var2')), ('d', ('d_var1', 'd_var2')), ('e', ('e_var1', 'e_var2')), ('f', ('f_var1', 'f_var2')), ('g', ('g_var1', 'g_var2')), ('h', ('h_var1', 'h_var2'))]

我会让您弄清楚打印格式。

答案 2 :(得分:0)

您可以使用itertools文档中的石斑鱼食谱:

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

for name, (attr1, attr2) in zip(NAMES_LIST, grouper(ATTRIBUTES_LIST, 2)):
    ...

似乎您可以假设ATTRIBUTES_LIST的元素数是NAMES_LIST的两倍,因此在这种情况下fillvalue的值无关紧要。

对于任何固定的n,只需硬编码适当的石斑鱼可能会更简单(并且可能会更高效):

def group2(iterable):
    itr = iter(iterable)
    while True:
        x = next(itr)
        y = next(itr)
        yield (x, y)

for name, (attr1, attr2) in zip(NAMES_LIST, group2(ATTRIBUTES_LIST)):
    ...