如果条件为真则合并子列表
Merge sublist if condition is true
示例:
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']]
子列表中的第一个元素是字符串数字
子列表中的第二个元素可以是任何字符串
如果子列表中的第一个元素已经在列表中,我想合并子列表(并删除双精度字符串)
输出:
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']]
如何根据条件获取合并列表?
也许你可以试试这个代码,但是return不是有序列表:
result = [[x] + [y[1]
for y in filter(lambda z: z[0] == x, mylist)]
for x in set(map(lambda q: q[0], mylist))]
如果您希望子列表和子列表中的项目的排序尽可能接近原始顺序,您可以使用 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)
输出:
[['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']]
以上构造 OrderedDict
,其中键是列表中的第一个元素,值是 OrderedDict
对象。二级字典包含列表中的第二个元素作为键。二级值无关紧要,仅使用 OrderedDict
因为 Python 标准库没有 OrderedSet
.
更新:假设
- 子列表有第三个元素,它是两个数字的列表
- 结果列表应根据第一个元素的首次出现进行排序
- 子列表应仅包含唯一的对,并根据对的第一个数字排序
您可以在第二层使用 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)
输出:
[['1', (22, 25)], ['4', (12, 19), (48, 53)], ['8', (14, 19)]]
这可能会变成一个生成器表达式,但简单地写出来,这种方法应该可行...
new_list = []
for number, date in mylist:
for index, item in enumerate(new_list):
if item[0] == number:
if date not in item:
new_list[index].append(date)
break
else:
new_list.append([number, date])
输出:
[['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']]
不过,如前所述,OrderedDict,也许使用 setdefault
方法可能是更合适的解决方案,因为字典键是唯一的。
编辑:调整以删除重复项
作为@niemmi 的替代解决方案,您可以使用它,它也使用 OrderDict
:
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((key, []) for key in [tup[0] for tup in mylist])
for tup in mylist:
if tup[1] not in res[tup[0]]:
res[tup[0]].append(tup[1])
print(res)
另一个规则、直接且易于理解的示例是:
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']]
d = dict()
for sublist in mylist:
indx = sublist[0]
if indx in d.keys():
d[indx].append(sublist[1])
else:
d[indx] = sublist
res = []
for key,value in d.iteritems():
res.append(value)
print sorted(res, key=lambda l: int(l[0]),reverse=False)
输出:
[['2', '12/12/2016'], ['4', '10/12/2016', '10/12/2016', '12/12/2016'],
['5', '08/12/2016'], ['7', '12/12/2016'], ['10', '12/12/2016', 'test'],
['11', '08/12/2016']]
示例:
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']]
子列表中的第一个元素是字符串数字
子列表中的第二个元素可以是任何字符串
如果子列表中的第一个元素已经在列表中,我想合并子列表(并删除双精度字符串)
输出:
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']]
如何根据条件获取合并列表?
也许你可以试试这个代码,但是return不是有序列表:
result = [[x] + [y[1]
for y in filter(lambda z: z[0] == x, mylist)]
for x in set(map(lambda q: q[0], mylist))]
如果您希望子列表和子列表中的项目的排序尽可能接近原始顺序,您可以使用 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)
输出:
[['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']]
以上构造 OrderedDict
,其中键是列表中的第一个元素,值是 OrderedDict
对象。二级字典包含列表中的第二个元素作为键。二级值无关紧要,仅使用 OrderedDict
因为 Python 标准库没有 OrderedSet
.
更新:假设
- 子列表有第三个元素,它是两个数字的列表
- 结果列表应根据第一个元素的首次出现进行排序
- 子列表应仅包含唯一的对,并根据对的第一个数字排序
您可以在第二层使用 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)
输出:
[['1', (22, 25)], ['4', (12, 19), (48, 53)], ['8', (14, 19)]]
这可能会变成一个生成器表达式,但简单地写出来,这种方法应该可行...
new_list = []
for number, date in mylist:
for index, item in enumerate(new_list):
if item[0] == number:
if date not in item:
new_list[index].append(date)
break
else:
new_list.append([number, date])
输出:
[['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']]
不过,如前所述,OrderedDict,也许使用 setdefault
方法可能是更合适的解决方案,因为字典键是唯一的。
编辑:调整以删除重复项
作为@niemmi 的替代解决方案,您可以使用它,它也使用 OrderDict
:
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((key, []) for key in [tup[0] for tup in mylist])
for tup in mylist:
if tup[1] not in res[tup[0]]:
res[tup[0]].append(tup[1])
print(res)
另一个规则、直接且易于理解的示例是:
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']]
d = dict()
for sublist in mylist:
indx = sublist[0]
if indx in d.keys():
d[indx].append(sublist[1])
else:
d[indx] = sublist
res = []
for key,value in d.iteritems():
res.append(value)
print sorted(res, key=lambda l: int(l[0]),reverse=False)
输出:
[['2', '12/12/2016'], ['4', '10/12/2016', '10/12/2016', '12/12/2016'],
['5', '08/12/2016'], ['7', '12/12/2016'], ['10', '12/12/2016', 'test'],
['11', '08/12/2016']]