【问题标题】:Combining tuple elements from a list of tuples. Tuple elements are tuple and list组合元组列表中的元组元素。元组元素是元组和列表
【发布时间】:2016-12-19 20:57:16
【问题描述】:

我对 Python 比较陌生,很难想出一种方法来完成以下工作。目前,我有一个元组列表(大于list_one。这些元组中的元素是 1)一个元组和 2)一个字符串(这些字符串始终是两个值之一:在示例中为 'A' 或 @987654323 @(也可以是'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”列表。

【问题讨论】:

  • 向我们展示您的代码...
  • 欢迎来到 Stackoverflow!准确说明:a) 到目前为止您尝试过什么(显示 Minimal Complete Verifiable Example)b) 您在哪里卡住了(再次显示代码)。
  • 啊,刚刚看到你的cmets。感谢 SuperSaiyan ;) 老实说,我完全不确定如何处理这个特殊问题。我已经尝试了很多东西,例如主帖中的编辑。似乎不是一个非常困难的问题,但不知何故无法想出一个很好的方法来解决 1)在同一个列表中获取具有相同 'id' 的相邻“v”,然后创建一个新列表使用第二个“id”的“v”。

标签: python list


【解决方案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']}]

【讨论】:

  • id1 和 id6 列表具有相同的字母 A,因此列表与 tpl_list 中遇到的第一个 id (id1) 一起属于(据我了解)。我的输出:{'id3': ['v11', 'v12', 'v13', 'v14', 'v16'], 'id1': ['v1', 'v2', 'v3', 'v4' , 'v5', 'v6', 'v17', 'v18', 'v21']}
  • @MiroRodozov 查看解释“当字符串值 (A, B) 更改时,它应该创建一个新元组”。此外,这完全符合 OP 在问题中给出的示例。不过,它看起来不像你的。
  • 我现在看到了他想要的结果,你完全符合给定的描述,无论如何从他所说的我理解主键应该是字母,不管在最终的字典中的第一个 id出现对那个字母键必须使用。无论如何,可能是我过度设计了它
  • 感谢您的回复。阿米正确地理解了我的问题,米罗。这可能是我的解释不好。
【解决方案2】:

编辑

这解决了一个相关问题,其中与'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,并更新列表。

【讨论】:

  • 查看问题中“我正在尝试创建一个如下所示的新列表,但未成功”下面的示例输出。我不确定你的输出(在这种情况下,它似乎将所有内容合并到两个列表中)。
  • 我赞成这个,因为这个问题有点难以理解,它解决了一个相关的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 2016-08-15
  • 2016-04-12
相关资源
最近更新 更多