Python 错误的列表输出超出了预期
因此,我必须遍历这个列表,将偶数除以2,然后将赔率乘以3,但是当我将列表合并在一起打印时,它会给出[0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0]。我在循环中打印每个值,以检查它是否是算术错误,但它打印出正确的值。使用Python 错误的列表输出超出了预期,python,list,Python,List,因此,我必须遍历这个列表,将偶数除以2,然后将赔率乘以3,但是当我将列表合并在一起打印时,它会给出[0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0]。我在循环中打印每个值,以检查它是否是算术错误,但它打印出正确的值。使用lambda我发现每次调用它时它都会重写数据,因此我试图找到其他方法来实现这一点,同时仍然使用map函数。代码的约束条件是需要使用map函数来完成。以下是代码片段: data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] da
lambda
我发现每次调用它时它都会重写数据
,因此我试图找到其他方法来实现这一点,同时仍然使用map
函数。代码的约束条件是需要使用map函数来完成。以下是代码片段:
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
data_list1 = []
i = 0
while i < len(data):
if (data[i] % 2) == 0:
data_list1 = list(map(lambda a: a / 2, data))
print(data_list1[i])
i += 1
else:
data_list1 = list(map(lambda a: a * 3, data))
print(data_list1[i])
i += 1
print(list(data_list1))1
data=[1,2,3,4,5,6,7,8,9,10]
数据列表1=[]
i=0
而i
编辑:错误已被修复。从你最近的评论中,我完整地编辑了下面的答案(旧版本可以在这篇文章的编辑历史中找到)
从您的更新中,我看到您的限制是使用
map
。那么,让我们谈谈这是如何工作的:
map
是一个存在于许多语言中的函数,一开始看到它可能会感到惊讶,因为它将函数作为参数。一个类比可能是:你给一个工匠(映射功能)一块金属(值列表)和一个工具(传递到映射中的功能),然后你告诉他,在每一块金属上使用该工具,并将修改后的零件还给你
需要了解的一件非常重要的事情是,map
获取一个完整的列表/iterable,然后返回一个新的iterable<代码>映射负责循环,因此您不必这样做
- 如果你递给他一把锤子作为工具,每一块金属上都会有一个凹痕李>
- 如果你递给他一个划线器,每一块金属都会有划痕
- 如果你递给他一个锻炉作为工具,每一块金属都会熔化
map
的实际例子,这有助于练习
另一个更实用的示例是将数据保存到磁盘
上面的例子是故意设计的,以保持简单。但这不太实际。下面是另一个实际有用的示例,将文档存储在磁盘上。我们假设有一个函数fetch_documents
,它返回字符串列表,其中字符串是文档的文本内容。我们想把它们存储到.txt
文件中。作为文件名,我们将使用内容的MD5散列。选择MD5的原因是为了保持简单。这样,我们仍然只需要“mapped”函数的一个参数,并且它足够唯一,以避免覆盖:
from assume_we_have import fetch_documents
from hashlib import md5
def store_document(contents):
"""
Store the contents into a unique filename and return the generated filename.
"""
hash = md5(contents)
filename = '%s.txt' % hash.hexdigest()
with open(filename, 'w') as outfile:
outfile.write(contents)
return filename
documents = fetch_documents()
stored_filenames = map(store_document, documents)
使用map
的最后一行可以替换为:
stored_filenames = []
for document in documents:
filename = store_document(document)
stored_filenames.append(filename)
您可以按如下方式设置输出字符串的格式:
打印(“,”.join([%2.1f”%(.5*x如果(x%2)==0,否则3*x)用于数据中的x])
我执行此操作的最简单方法如下:
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
data_list1 = []
i = 0
for i in range(len(data)):
if (data[i]%2) == 0:
data_list1=data_list1+[int(data[i]/2)]
elif (data[i]%2) == 1: # alternatively a else: would do, but only if every entry in data is an int()
data_list1=data_list1+[data[i]*3]
print(data_list1)
在您的例子中,for循环使代码更易于阅读,但是while循环也同样有效
在原始代码中,问题在于map()函数。如果查看相关文档,您会发现map()会影响iterable中的每一项。您不希望这样做,而是只希望更改指定的条目
编辑:如果出于某种原因想使用lambda,这里有一种(非常无用的)方法:
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
data_list1 = []
for i in range(len(data)):
if (data[i] % 2) == 0:
x = lambda a: a/2
data_list1.append(x(data[i]))
else:
y = lambda a: a*3
data_list1.append(y(data[i]))
print(data_list1)
如果您有其他设计约束,请在问题中指定它们,以便我们提供帮助
Edit2:再一次提到漏洞:由于您添加了约束,下面介绍如何使用映射函数:
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def changer(a):
if a%2==0:
return a/2
else:
return a*3
print(list(map(changer,data)))
如果您希望它位于新列表中,只需添加data\u list1=list(map(changer,data))
希望这就是你要找的 我推荐一些基本的调试——至少,把
print
s放进去看看发生了什么。这应该是所有数字除以2的线索。这看起来像是一个家庭作业问题。请看这篇文章:您在整个数组上使用lambda函数,因此它改变了所有内容,而不仅仅是偶数。并且您的打印仅显示所需的索引,该索引对应于中的True
condition@DavidS哦,好吧,这很有道理,谢谢!然后我会尝试其他方法。如果我将每个元素添加到一个单独的列表中,然后加入它,我可以保留lambda吗?我知道这不是最有效的方法,但我不允许使用其他东西。更新!Idk,如果我需要使用lambda,但我尝试用math创建一个外部函数,然后执行它,但它不起作用。我真的不知道map函数的限制是什么,但是在map中执行if语句也可以吗?从java.yikes中可以做的事情中提取这些信息。。。许多打字错误(包括调用map
)。。。他们现在都修好了:)我明白了,顺便说一句,很好的类比!那么:map(metals,forge)
和map(forge,metals)
有什么区别呢?编辑:nvm看到了更新的打字错误,一个是正确的,另一个是错误的(那就是打字错误)map
将函数作为第一个参数。不是一个值列表。看,哇,我真的不知道它是如何工作的,但我不得不说,它的格式非常好。我已经更新了答案,将数学考虑在内:-)@RodrigoL如果你
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def changer(a):
if a%2==0:
return a/2
else:
return a*3
print(list(map(changer,data)))