2016-08-12 183 views
2

我对Python相对较新,并且很难提出一种方法来完成以下工作。目前,我有一个元组列表(大于list_one,这些元组内的元素为1)一个元组,以及2)一个字符串(这些字符串总是两个值中的一个:例如'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')] 

我想,没有成功,创建一个新的列表如下所示:

new_list1 = [('id1',['v1', 'v2', 'v3', 'v4', 'v5', 'v6']), ('id3',['v11', 'v12', 'v13', 'v14', 'v16']), ('id6',['v17', 'v18', 'v21'])] 

当字符串值(A,B)改变它应该创建一个新的元组,第一个元素是A,B改变的初始元组的id,第二个元素是初始列表中的值列表(“v's”)。字典也可以罚款,例如:

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]) 

给出:

['v1', 'v2', 'v3', 'v4', 'v5', 'v6', ['v11'], ['v12', 'v13'], ['v14', 'v16'], 'v17', 'v18', 'v21'] 

这是不是真的就是我要找的,因为这会产生一个 'A' 值围绕一个列表,列表“ B'里面。

+2

向我们展示您的代码... –

+1

欢迎来到Stackoverflow!准确地说:a)到目前为止你所尝试的是什么(展示一个**最小完整的可验证示例**)b)你卡在哪里(再次显示代码)。 – SuperSaiyan

+0

啊,只是看到你的意见。感谢SuperSaiyan;)老实说,我不确定如何处理这个问题。我已经尝试了很多东西,例如见主帖子中的编辑。似乎不是一个非常困难的问题,但不知何故不能想出一个好方法来处理1)获取在相同列表中具有相同“id”的相邻“v”,然后创建一个新列表与第二个“id”的“v”相关联。 – PDavis

回答

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']}] 
+0

id1和id6列表具有相同的字母A,因此这些列表与第一个id(id1)在tpl_list中相遇(据我了解)。 my out: {'id3':['v11','v12','v13','v14','v16'],'id1':['v1','v2','v3','v4 ','v5','v6','v17','v18','v21']} –

+0

@MiroRodozov查看解释“当字符串值(A,B)改变时它应该创建一个新的元组”。而且,这与OP在问题中给出的例子完全吻合。不过,它看起来不像你的。 –

+0

我现在看到了他期望的结果,你说得对,完全符合给出的描述,无论如何,从他所说的我理解的主键应该是字母之一,无论在最后的字典中第一个id出现在该字母键上必须使用。无论如何,这可能是我过度设计它 –

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 

这到底是怎么做到的是,每个字母键(说)你想只有第一个满足的ID(比如ID1)成为了关键以下列表。创建一个map来存储letterKey及其idKey,在第一次出现时,然后检查字母键是否已经存在于该地图中,如果是,则使用相应的idKey并更新列表。

+0

查看下面的示例输出“我试图创建一个新列表,看起来如下:”,但问题并未成功。我不确定你的输出(在这种情况下,它似乎将所有内容都组合到了两个列表中)。 –

+0

我对此表示赞同,因为这个问题有点难以遵循,并且解决了一个相关的问题。 –