如果条件为真,则合并子列表

Rem*_*man 1 python merge conditional list python-3.x

例:

mylist = [['2', '12/12/2016'], ['4', '10/12/2016'], ['5', '08/12/2016'], ['4', '10/12/2016'], ['7', '12/12/2016'], ['10', '12/12/2016'], ['11', '08/12/2016'], ['4', '12/12/2016'], ['10', 'test']]
Run Code Online (Sandbox Code Playgroud)

子列表中的第一个元素是字符串编号子列表中
的第二个元素可以是任何字符串

如果子列表中的第一个元素已经在列表中,我想合并子列表(并删除双重的字符串)

输出:

newlist = [['2', '12/12/2016'], ['4', '10/12/2016', '12/12/2016'], ['5', '08/12/2016'], ['7', '12/12/2016'], ['10', '12/12/2016', 'test'], ['11', '08/12/2016']]
Run Code Online (Sandbox Code Playgroud)

如何根据条件获取合并列表?

nie*_*mmi 6

如果您希望将子列表中的子列表和项目的排序保持尽可能接近原始状态,则可以使用OrderedDict:

from collections import OrderedDict

mylist = [['2', '12/12/2016'], ['4', '10/12/2016'], ['5', '08/12/2016'],
          ['4', '10/12/2016'], ['7', '12/12/2016'], ['10', '12/12/2016'],
          ['11', '08/12/2016'], ['4', '12/12/2016'], ['10', 'test']]

res = OrderedDict()
for s1, s2 in mylist:
    res.setdefault(s1, OrderedDict())[s2] = True

res = [[k] + list(v) for k, v in res.items()]
print(res)
Run Code Online (Sandbox Code Playgroud)

输出:

[['2', '12/12/2016'], ['4', '10/12/2016', '12/12/2016'], ['5', '08/12/2016'], 
 ['7', '12/12/2016'], ['10', '12/12/2016', 'test'], ['11', '08/12/2016']]
Run Code Online (Sandbox Code Playgroud)

上面的结构OrderedDict,其中键是列表中的第一个元素,值是OrderedDict对象.二级dicts包含列表中的第二个元素作为键.二级值是无关紧要的,OrderedDict仅用于Python标准库所没有的OrderedSet.

更新:假设

  1. 子列表具有第三个元素,它是两个数字的列表
  2. 结果列表应根据第一次出现的第一个元素进行排序
  3. 子列表应仅包含唯一对,并根据对的第一个数字进行排序

您可以set在第二级使用并在构造结果时对对进行排序:

from collections import OrderedDict

mylist = [['1', 'string1', [22,25]], ['4', 'string1', [12,19]], 
          ['4', 'string3', [48,53]], ['8', 'string3', [14,19]],
          ['4', 'string3', [48,53]]]

res = OrderedDict()
for s, _, l in mylist:
    res.setdefault(s, set()).add(tuple(l))

res = [[k] + sorted(v) for k, v in res.items()]
print(res)
Run Code Online (Sandbox Code Playgroud)

输出:

[['1', (22, 25)], ['4', (12, 19), (48, 53)], ['8', (14, 19)]]
Run Code Online (Sandbox Code Playgroud)