我对Python相对较新,并且很难想出一种方法来完成以下工作。目前,我有一个元组列表(大于list_one
。这些元组中的元素是1)一个元组,2)一个字符串(这些字符串总是两个值中的一个:在示例中{{1} }或'A'
(也可以是'B'
或'D'
,或任何其他两个字符串。内部元组包含'Z'
和'id'
个值(字符串):
list
我尝试创建一个如下所示的新列表,但未成功:
list_one = [(('id1', ['v1', 'v2']), 'A'), (('id2', ['v3', 'v4', 'v5', 'v6']), 'A'), (('id3', ['v11']), 'B'), (('id4', ['v12', 'v13']), 'B'), (('id5', ['v14', 'v16']), 'B'), (('id6', ['v17', 'v18', 'v21']), 'A')]
当字符串值(A,B)发生变化时,它应该创建一个新元组,第一个元素是初始元组的id,其中A,B发生变化,第二个元素是值列表(&# 34; v' s")在初始列表中。如果字典也可以,那就是一个列表,例如:
new_list1 = [('id1',['v1', 'v2', 'v3', 'v4', 'v5', 'v6']), ('id3',['v11', 'v12', 'v13', 'v14', 'v16']), ('id6',['v17', 'v18', 'v21'])]
我感谢任何指导。
编辑:
new_list2 = [{'id1': ['v1','v2', 'v3', 'v4', 'v5', 'v6']}, {'id3':['v11', 'v12', 'v13', 'v14', 'v16']}, {'id6':['v17', 'v18', 'v21']}]
给出:
s = list_one[0][1]
for tup in list_one:
if s in tup:
new_list.extend(tup[0][1])
else:
new_list.append(tup[0][1])
这并不是我真正想要的,因为这会创建一个围绕着A' A'价值,以及' B'内部。
答案 0 :(得分:1)
修改强>
这解决了相关问题,其中汇总了与'A'
和'B'
值对应的所有列表,并且为每个组选择了ID的总ID。
你去吧
letterKeyToFirstIDMap = {}
result_dict = {}
for tpl in list_one:
id = tpl[0][0]
lst = tpl[0][1]
letter_id = tpl[1]
if not letter_id in letterKeyToFirstIDMap:
letterKeyToFirstIDMap.update({letter_id: id})
result_dict.update({id:[]})
result_dict[letterKeyToFirstIDMap[letter_id]] += lst
print result_dict
这里所做的是,对于每个字母键(比如说A),您只希望第一个符合的id(比如id1)成为以下列表的键。您创建一个映射以在第一次出现时存储letterKey及其idKey,然后只检查该映射中是否已存在字母键,如果是,则使用相应的idKey,并更新列表。
答案 1 :(得分:1)
你基本上可以循环,记住当前键是什么(初始化为None
)。
key = None # This is 'A' or 'B' in your example, but it starts off as None
new_list = [] # This holds the final result
for r, l in [(r, l) for (l, r) in list_one]:
if r != key: # If the current is not the key, time to switch to a new one
id_ = l[0]
new_list.append({id_: []})
new_list[-1][id_].extend(l[1]) # Extend the current list
key = r # Make it the current key in any case.
>>> new_list
[{'id1': ['v1', 'v2', 'v3', 'v4', 'v5', 'v6']},
{'id3': ['v11', 'v12', 'v13', 'v14', 'v16']},
{'id6': ['v17', 'v18', 'v21']}]