Python 将具有相同元素的列表与整数相加

Python 将具有相同元素的列表与整数相加,python,Python,我有一个嵌套列表,如何通过添加其编号来删除相同的元素 我的清单包括: lis = [['apple', 32], ['Blue shirt', 323], ['Blue shirt', 320]] 我想把这件'blueshirt'合并起来,这样做: lis = [['apple', 32], ['Blue shirt', 643]] 到目前为止我都试过了 lis = [['apple',32],['Blue shirt',323],['Blue shirt',320]] l = -1 new

我有一个嵌套列表,如何通过添加其编号来删除相同的元素

我的清单包括:

lis = [['apple', 32], ['Blue shirt', 323], ['Blue shirt', 320]]
我想把这件
'blueshirt'
合并起来,这样做:

lis = [['apple', 32], ['Blue shirt', 643]]
到目前为止我都试过了

lis = [['apple',32],['Blue shirt',323],['Blue shirt',320]]
l = -1
new = 0
n = []
for i in lis:
    l+=1
    if lis[l][0] in i:
        count = lis[l].count('Blue shirt')
        if count > 1:
            new += lis[l][1]
            n.append(new)
            name = lis[l][0]
            n.append(name)
            lis.pop(l)

print(n)
我的方法是,如果名称超过2,则计算名称的出现次数,然后用该名称和更新的价格制作一个新列表,并将其放在前一个列表的位置,但这不够简单


我正在尝试count函数,但它在嵌套列表中似乎无法有效工作。如果不使用一些外部函数(导入),您希望使用最简单的选项来解决此问题。

仅使用基本Python:

grouped = dict.fromkeys((x[0] for x in lis), 0) # count dict with unique lis names

for el in lis:
    grouped[el[0]] += el[1] # sum values per name

[[k,v] for k, v in grouped.items()] # convert back to list
#[['apple', 32], ['Blue shirt', 643]]
不确定“外部功能”是否意味着没有额外的导入-但如果可以使用Pandas,请使用
groupby
sum

import pandas as pd

pd.DataFrame(lis).groupby(0, as_index=False).sum().values

array([['Blue shirt', 643],
       ['apple', 32]], dtype=object)

假设您既不能使用外部库也不能使用集合。Counter()以下解决方案可能会帮助您:

lis = [['apple', 32], ['Blue shirt', 323], ['Blue shirt', 320]]
d = {}

for (name, count) in lis:
    d[name] = d.get('name', 0) + count

lis = [[name, count] for name, count in d.items()]

使用
list.count()
的问题在于,它只适用于单个列表,但您有一个列表列表。基本上,我的解决方案使用一个字典,它将需要计数的项作为键,将计数作为值。然后我使用列表理解来产生你的欲望输出

另一种不使用任何库的方法(如
collections.Counter
):

输出:

[['apple', 32], ['Blue shirt', 643]]
list.count('Blue shirt')
统计字符串
'Blue shirt'
出现在列表中的次数。这仅仅是一次,对你的需求来说不是一个有用的数字

您希望将字符串放入字典中,以便无需进行完整扫描即可跟踪数字:

counts = {}
for name, count in lis:
    counts[name] = counts.get(name, 0) + count
现在你有了一个所有数字和的映射;将其转换回列表:

lis = [[name, count] for name, count in counts.items()]
这不一定与输入列表中的元素保持相同的顺序。如果需要,您必须循环原始列表,查看名称字符串是否仍然存在,如果仍然存在,请将名称和计数从映射添加到新列表,并从映射中删除名称:

ordered_lis = []
for name, __ in lis:
    if name in counts:
        ordered_lis.append([name, counts.pop(name)])
但是,在Python3.6及更新版本中,字典将记住键的插入顺序,这意味着循环
计数.items()
将以最初看到的顺序再次显示字符串

演示,使用Python 3.6:

>>> lis = [['apple', 32], ['Blue shirt', 323], ['Blue shirt', 320]]
>>> counts = {}
>>> for name, count in lis:
...     counts[name] = counts.get(name, 0) + count
...
>>> [[name, count] for name, count in counts.items()]
[['apple', 32], ['Blue shirt', 643]]

如果可以使用标准库,那么还可以使用对象来避免使用
counts.get(name,0)
(在循环外部使用
counts=defaultdict(int)
,而在循环中使用
counts[name]+=1
),或者让字典记住在Python 3.6之前的Python版本上的插入顺序。

为什么新列表嵌套得更深?你不想做什么?你是如何使用计数功能的?您是否考虑过使用
collections.Counter()
?我还没有使用计数器,但我正在使用for循环中的count函数。您可以共享不起作用的代码吗?使用基本Python解决方案更新了PostUpdate。您可以从
集合()中删除
[
]
括号
调用并传入生成器表达式。这样可以避免创建一个新的列表对象,一旦
set()
完成,它就会被再次丢弃。然后,您应该用
{…}
集理解替换
set()
,而此时:
names={x[0]表示lis中的x}
。但是,除了生成字典之外,您永远不会使用
名称
,因此您可以只使用
group=dict.fromkeys((x[0]表示lis中的x),0)
。哇,太好了。感谢@Martijn Pieters的指导。我将投票支持您对解决方案的详细说明,我喜欢Python 3.6的解释。嗨,谢谢您的解决方案。但我想知道我是否有2个值,例如['Blue shirt',643,2],我如何在list@NoobSaibot:这对我来说是不够的。这些数字有不同的含义吗?它们要加起来吗?你能给出一个好的输入示例和预期的输出吗?嗨,谢谢你的回复。。假设我有相同的列表[['apple',32,2],'Blue shirt',323,3],'Blue shirt',320,1]]这三个数字实际上也是需要添加的数量,就像价格汇总的方式一样。。我需要这些数量加起来,以及其他数量的输出将是[['苹果',32,2],'蓝色衬衫',643,4]]
>>> lis = [['apple', 32], ['Blue shirt', 323], ['Blue shirt', 320]]
>>> counts = {}
>>> for name, count in lis:
...     counts[name] = counts.get(name, 0) + count
...
>>> [[name, count] for name, count in counts.items()]
[['apple', 32], ['Blue shirt', 643]]