Python:从数字列表中删除底片

时间:2014-01-06 21:53:32

标签: python list negative-number

问题是从数字中删除否定词。

执行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()

8 个答案:

答案 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保留变量名称,例如rnum_list与可变数据分开,例如[1, 2, 3, 6, 1]。名称只是指向数据的指针。考虑赋值语句:

r = num_list

运行此语句后,rnum_list都指向相同的数据。如果您对r的数据进行了更改,那么您也会对num_list的数据进行更改,因为它们都指向相同的数据。现在,考虑一下:

r = num_list[:]

该语句告诉python只采用它的某些元素来修改num_list的数据。因此,python会复制num_list的数据。恰好,[:]指定我们希望所有num_list的数据都保持不变,但这并不能阻止python制作副本。该副本已分配给r。这意味着rmum_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)