根据列表元素之一的值,从现有列表中准备4个列表

时间:2017-08-04 20:41:10

标签: python python-2.7

我需要根据一个列表的元素准备2个列表。

> make update-deps
make: *** No rule to make target `update-deps'.  Stop.
> make [tag=v0.5.2] update-deps
make: *** No rule to make target `update-deps'.  Stop.
> make tag=v0.5.2 update-deps
make: *** No rule to make target `update-deps'.  Stop.

我需要将列表>>> a = ['ether1000', 'ether1000', 'ether1000', 'ether1000', 'ether100Gig', 'ether100Gig'] >>> b = ['1/11/5', '1/11/6', '1/11/7', '1/11/8', '1/6/1', '1/6/2'] 的元素映射到列表a的元素,并从列表b创建一个新列表,列表b具有b

所以这应该是结果列表:

ether1000

我尝试过拉下2个列表:

res1 = ['ether1000', 'ether1000', 'ether1000', 'ether1000']
res2 = ['1/11/5', '1/11/6', '1/11/7', '1/11/8']
res3 = ['ether100Gig', 'ether100Gig']
res4 = ['1/6/1', '1/6/2']

但是从这一点来说,我不确定如何提取>>> zip(a, b) [('ether1000', '1/11/5'), ('ether1000', '1/11/6'), ('ether1000', '1/11/7'), ('ether1000', '1/11/8'), ('ether100Gig', '1/6/1'), ('ether100Gig', '1/6/2')] >>> c = zip(a,b) >>> for i in c: ... if 'ether1000' in i: ... d.append[i(1)] ... Traceback (most recent call last): File "<stdin>", line 3, in <module> TypeError: 'tuple' object is not callable 值的元素,并按上述方式制作2个列表。如果有人能给我一个如何解决这个问题的暗示会很好吗?

根据答案进行编辑:

我得到了这两个列表,无论如何我可以制作另外两个列表res3和res4吗?

ether1000

4 个答案:

答案 0 :(得分:2)

你应该通过以下方式调用元组的索引来调用.append()

d.append(i[1])

你的括号和圆括号混在了一起。 .append()括号,因为它是一个函数,当访问列表或元组中的项时,使用括号(即i[index])。你的错误基本上告诉你一个元组不是一个函数。您也可以使用列表理解来帮助:

[i[1] for i in zip(a,b) if 'ether1000' in i]

感谢@ChristianDean

答案 1 :(得分:1)

问题在于行d.append[i(1)],而应该使用:

#       v  `(..)` for function call 
d.append(i[1])
#         ^ for fetching the index
# Since you want to access the index, you need to use `i[1]`

以下是您输入的示例:

>>> a = ['ether1000', 'ether1000', 'ether1000', 'ether1000', 'ether100Gig', 'ether100Gig']
>>> b = ['1/11/5', '1/11/6', '1/11/7', '1/11/8', '1/6/1', '1/6/2']

>>> res1, res2, res3, res4 = [], [], [], []
>>> for i, j in zip(a, b):
...     if i == 'ether1000':
...         res1.append(i)
...         res2.append(j)
...     else:
...         res3.append(i)
...         res4.append(j)
...
>>> res1
['ether1000', 'ether1000', 'ether1000', 'ether1000']
>>> res2
['1/11/5', '1/11/6', '1/11/7', '1/11/8']
>>> res3
['ether100Gig', 'ether100Gig']
>>> res4
['1/6/1', '1/6/2']

但是,您可以使用列表理解zip简化您的答案:

>>> res1, res2 = zip(* [i for i in zip(a,b) if 'ether1000' in i[0]])
>>> res1
('ether1000', 'ether1000', 'ether1000', 'ether1000')
>>> res2
('1/11/5', '1/11/6', '1/11/7', '1/11/8')
# These are the `tuple` values instead of `list` but I don't think it matters for you

>>> res3, res4 = zip(* [i for i in zip(a,b) if 'ether1000' not in i[0]])
>>> res3
('ether100Gig', 'ether100Gig')
>>> res4
('1/6/1', '1/6/2')

但是在列表理解方法中,你将两次迭代你的初始列表。我建议使用第一种方法。

答案 2 :(得分:1)

您可以创建一个包含列表b中所有匹配项的字典(键入项目)。然后只需获取相关项并将其分配给您的变量。第一个列表很容易创建(例如['ether1000','ether1000','ether1000','ether1000']),因为它只是[key] * len(result [key])。

使用字典理解创建变量result,并使用条件列表推导创建此字典中的每个值。

虽然您需要为每个唯一项目传递字典,但它可能比循环一次并附加到多个列表更有效。但是,如果您有相对于列表大小的大量唯一项目,则可能更适合使用其他方法(请参阅选项2

选项1

result = {unique_item: [val for item, val in zip(a, b) if item == unique_item]
          for unique_item in set(a)}

res2 = result['ether1000']
res1 = ['ether1000'] * len(res2)

>>> res1
['ether1000', 'ether1000', 'ether1000', 'ether1000']

>>> res2
['1/11/5', '1/11/6', '1/11/7', '1/11/8']

选项2

您可以使用defaultdict创建空列表字典。然后枚举列表a并将列表b中的相应项添加到项目上键入的字典中。

from collections import defaultdict

result = defaultdict(list)

for n, item in enumerate(a):
    result[item].append(b[n])

然后按上述步骤继续res1res2

答案 3 :(得分:0)

你可以通过 -

来做到
a = ['ether1000', 'ether1000', 'ether1000', 'ether1000', 'ether100Gig', 'ether100Gig']
b = ['1/11/5', '1/11/6', '1/11/7', '1/11/8', '1/6/1', '1/6/2']
a_uniq = list(set(a))

results = []

for each in a_uniq:
    ind = [i for i in range(len(a)) if a[i] == each]
    _a = [a[i] for i in ind]
    _b = [b[i] for i in ind]
    results.append([_a,_b])

results中的每个元素都是两个列表的列表,其中包含a的值和来自b的对应元素