问题是从数字中删除否定词。
执行remove_negs([1, 2, 3, -3, 6, -1, -3, 1])
时,结果为:[1, 2, 3, 6, -3, 1]
。结果假设为[1, 2, 3, 6, 3, 1]
。发生的事情是,如果一行中有两个负数(例如-1, -3
),那么第二个数字将不会被删除。
def main():
numbers = input(“输入数字列表:”)
remove_negs(号码)的
def remove_negs(num_list):
'''Remove the negative numbers from the list num_list.'''
for item in num_list:
if item < 0:
num_list.remove(item)
print num_list
main()
答案 0 :(得分:12)
在迭代过程中从列表中删除元素通常是一个坏主意(请参阅我的评论中的the link以获取解释为什么会这样)。更好的方法是使用list comprehension:
num_list = [item for item in num_list if item >= 0]
请注意,上面的行会创建一个 new 列表并为其指定num_list
。您还可以对表单进行“就地”分配
num_list[:] = ...
不会在内存中创建新列表,而是修改num_list
已经指向的内存位置。更详细地解释了这种差异here。
答案 1 :(得分:8)
更简单:
>>> a = [ 1, 2, 3, -3, 6, -1, -3, 1]
>>> [x for x in a if x >= 0 ]
[1, 2, 3, 6, 1]
如果你确实想要循环,请试试这个:
def remove_negs(num_list):
r = num_list[:]
for item in num_list:
if item < 0:
r.remove(item)
print r
这样做你想要的:
>>> remove_negs([ 1, 2, 3, -3, 6, -1, -3, 1])
[1, 2, 3, 6, 1]
关键是赋值语句r = num_list[:]
复制num_list。为了不混淆循环,我们然后从r
而不是从我们循环的列表中删除项目。
更多: Python对变量的处理有点微妙。 Python保留变量名称,例如r
或num_list
与可变数据分开,例如[1, 2, 3, 6, 1]
。名称只是指向数据的指针。考虑赋值语句:
r = num_list
运行此语句后,r
和num_list
都指向相同的数据。如果您对r
的数据进行了更改,那么您也会对num_list
的数据进行更改,因为它们都指向相同的数据。现在,考虑一下:
r = num_list[:]
该语句告诉python只采用它的某些元素来修改num_list
的数据。因此,python会复制num_list
的数据。恰好,[:]
指定我们希望所有num_list
的数据都保持不变,但这并不能阻止python制作副本。该副本已分配给r
。这意味着r
和mum_list
现在指向不同的数据。我们可以对r
的数据进行更改,但不会影响num_list
的数据,因为它们具有不同的数据。
如果您不熟悉,可能需要查看本教程,了解python对变量名称和变量数据的处理方法:Understanding Python variables and Memory Management
<强>示例:强>
>>> a = [ 1, 2, 3, -3, 6, -1, -3, 1]
>>> b = a # a and b now point to the same place
>>> b.remove(-1)
>>> a
[1, 2, 3, -3, 6, -3, 1]
对比:
>>> a = [ 1, 2, 3, -3, 6, -1, -3, 1]
>>> b = a[:] # a and b now point to different data
>>> b
[1, 2, 3, -3, 6, -1, -3, 1]
>>> b.remove(-1)
>>> b
[1, 2, 3, -3, 6, -3, 1]
>>> a
[1, 2, 3, -3, 6, -1, -3, 1]
答案 2 :(得分:3)
另一种解决方案
filter( lambda x: x>0, [ 1, 2, 3, -3, 6, -1, -3, 1])
[1, 2, 3, 6, 1]
答案 3 :(得分:1)
来自对arshajii答案的评论:
但这消除了负数。我需要删除负号,但仍然将号码保留在列表中。
删除负数正是您的代码显然正在尝试做的事情,而且它也是获得所需结果的唯一方法:
结果假设为[1,2,3,6,3,1]
但如果你真的想从数字中“消除负号”,那就更容易了。例如,要删除-3
中的否定号,您只需将其否定并获取3
,对吧?您可以在现有代码中执行此操作:
for index, item in enumerate(num_list):
if item < 0:
num_list[index] = -item
......或者在列表理解中,如arshajii的:
num_list = [-item if item < 0 else item for item in num_list]
使用abs
函数更加容易,它确实可以消除负数,只留下正数和零值:
num_list = [abs(item) for item in num_list]
无论哪种方式,当然,这会给你[1, 2, 3, 3, 6, 1, 3, 1]
,这是错误的答案......但如果你的评论是正确的,那就是你要求的答案。
答案 4 :(得分:1)
其他传统variable operator non-variable
尝试一些yoda conditions =)
>>> [i for i in x if 0 <= i]
[1, 2, 3, 6, 1]
答案 5 :(得分:0)
将数字从负号上除去,这是最容易做的事情
def remove_negs(somelist):
for each in somelist:
if each < 0:
somelist[somelist.index(each)] = -each
print(somelist)
例如
rNegatives([ - 2,5,11,-1])
打印出来
[2,5,11,1]
答案 6 :(得分:0)
我认为优雅的解决方案可以是这样的:
$(document).ready(function() {
var dates = $('#dates').val();
console.log(dates);
$('#dataTable').DataTable({
"lengthMenu" : dates
});
});
var day, month, year;
$('.dates').change(DatesChanged);
DatesChanged();
function DatesChanged() {
var date = $('.dates').val();
var splitDate = date.split("/");
day = splitDate[0];
month = splitDate[1];
year = splitDate[2];
var maxDays = daysInMonth(month, year);
CreateJSONArray(maxDays, date);
}
function daysInMonth(month, year) {
return new Date(year, month, 0).getDate();
}
function CreateJSONArray(maxDays, date) {
var arr = [];
var monthNames = ["January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
];
var dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
var d;
for (var day = 1; day <= maxDays; day++) {
d = new Date(date);
arr.push({
"dayNumber": day,
"dayName": dayNames[d.getDay()],
"monthName": monthNames[month - 1],
"year": d.getYear() + 1900
});
date = d.setDate(d.getDate() + 1);
}
DisplayTable(arr);
console.log(arr);
}
function DisplayTable(data) {
//heading
document.getElementsByClassName("month-year")[0].innerHTML = data[0].monthName + ", " + data[0].year;
//Table
$('.dayTableBody').empty();
$.each(data, function (index, value) {
data += '<tr align="center">';
data += '<td>' + value.dayNumber + '<input type="hidden" name="dayNumber" value="' + value.dayNumber + '">' + '</td>';
data += '<td>' + value.dayName + '</td>';
//get amount of types of Clients
var clientTypes = ["Individual","Corporation"];
for (var i = 0; i < clientTypes.length; i++) {
data += '<td>' + '<input class="text-center amountOfClients" type="number" value="0" name="amountOfClients-' + clientTypes[i] + '" data-error="Please, insert a value" required>' + '</td>'
data += '<div class="help-block with-errors"></div>'
}
data += '</tr>';
});
$('.dayTableBody').append(data);
}
答案 7 :(得分:0)
A=[1,2,-3,5,-8,-22,-4,6,9,-12]
B=list(filter(lambda x: x >= 0, A))
print(B)