Python:AttributeError:';元组';对象没有属性';设置默认值';

Python:AttributeError:';元组';对象没有属性';设置默认值';,python,python-2.7,dictionary,reduce,Python,Python 2.7,Dictionary,Reduce,说一个元组列表,如下所示: y=[('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')] 我试图使用reduce()特性为y中的每个元素生成一个字符串。 ''.join(列表(x)给出了第一次迭代的“abc” z=reduce(lambda x, u=dict(): u.setdefault(''.join(list(x)), []).e

说一个元组列表,如下所示:

y=[('a', 'b', 'c'),
 ('a', 'c', 'b'),
 ('b', 'a', 'c'),
 ('b', 'c', 'a'),
 ('c', 'a', 'b'),
 ('c', 'b', 'a')]
我试图使用reduce()特性为y中的每个元素生成一个字符串。 ''.join(列表(x)给出了第一次迭代的“abc”

z=reduce(lambda x, u=dict(): u.setdefault(''.join(list(x)), []).extend(''.join(list(x))), y)
错误:

AttributeError                            Traceback (most recent call last)
<ipython-input-102-79858e678e78> in <module>()
----> 1 z=reduce(lambda x, u=dict(): u.setdefault(''.join(list(x)), []).extend(''.join(list(x))), y)

<ipython-input-102-79858e678e78> in <lambda>(x, u)
----> 1 z=reduce(lambda x, u=dict(): u.setdefault(''.join(list(x)), []).extend(''.join(list(x))), y)

AttributeError: 'tuple' object has no attribute 'setdefault'
AttributeError回溯(最近一次调用)
在()
---->1 z=reduce(lambda x,u=dict():u.setdefault(“”.join(list(x)),[])。extend(“”.join(list(x))),y)
in(x,u)
---->1 z=reduce(lambda x,u=dict():u.setdefault(“”.join(list(x)),[])。extend(“”.join(list(x))),y)
AttributeError:“tuple”对象没有属性“setdefault”
reduce()
始终使用两个参数调用,因此您的
u
参数被设置为
y
中的第二个值,即元组。默认值被忽略

您确实不应该在这里使用
reduce()
reduce()
您需要在每次循环迭代中使用迭代器中的下一个元素来计算一个聚合值

您正在映射:

或者使用列表:

[''.join(x) for x in y]
reduce()
始终使用两个参数调用,因此您的
u
参数被设置为
y
中的第二个值,即元组。默认值被忽略

您确实不应该在这里使用
reduce()
reduce()
您需要在每次循环迭代中使用迭代器中的下一个元素来计算一个聚合值

您正在映射:

或者使用列表:

[''.join(x) for x in y]

不清楚为什么要减少参与。您是否正在寻找:

[''.join(t) for t in y]

不清楚为什么要减少参与。您是否正在寻找:

[''.join(t) for t in y]

@MartijnPieters u{}print u{}@MartijnPieters为什么没有运行?它不是从迭代器列表中获取的吗?@MartijnPieters u{}print u{}@MartijnPieters为什么没有运行?它不是从迭代器列表中获取的吗?我也感到困惑,并想出了一个`z=[''。为y中的项加入(项)]'然后你发布了这个+1,我也感到困惑,并想出了一个'z=[“”。为y中的项加入(项)]`然后你发布了这个+1,我认为我必须使用reduce(lambda arg1,arg2,dou_something(arg1,arg2),y)好的。谢谢我会使用map。顺便问一下,reduce()可以吗?@user2290820:不适合这个工作;
reduce()
取一个iterable并将元素“减少”为一。
reduce(lambda,b:a+b,[1,2,3,4])
将列表中的所有元素相加,从
1
2
开始,然后再次调用lambda,并给出第一次调用和下一个元素的结果,依此类推。好的,我认为我必须使用reduce(lambda arg1,arg2,dou_something(arg1,arg2),y)好的。谢谢我将使用map。顺便问一下,使用reduce()可以吗?@user2290820:不适用于此作业;
reduce()
使用iteable并将元素“减少”为一。
reduce(lambda,b:a+b,[1,2,3,4])
将对列表中的所有元素求和,从
1
2
开始,然后使用第一次调用和下一个元素的结果再次调用lambda,以此类推。