我需要根据一个列表的元素准备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
答案 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])
然后按上述步骤继续res1
和res2
。
答案 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的对应元素