简体   繁体   English

检测“for”循环中最后一个元素的pythonic方法是什么?

[英]What is the pythonic way to detect the last element in a 'for' loop?

I'd like to know the best way (more compact and "pythonic" way) to do a special treatment for the last element in a for loop.我想知道对 for 循环中的最后一个元素进行特殊处理的最佳方式(更紧凑和“pythonic”方式)。 There is a piece of code that should be called only between elements, being suppressed in the last one.有一段代码应该只元素之间调用,在最后一个被禁止。

Here is how I currently do it:这是我目前的做法:

for i, data in enumerate(data_list):
    code_that_is_done_for_every_element
    if i != len(data_list) - 1:
        code_that_is_done_between_elements

Is there any better way?有没有更好的办法?

Note: I don't want to make it with hacks such as using reduce .注意:我不想使用诸如使用reduce之类的技巧来实现它。 ;)

Most of the times it is easier (and cheaper) to make the first iteration the special case instead of the last one:大多数情况下,使第一次迭代成为特殊情况而不是最后一次更容易(也更便宜):

first = True
for data in data_list:
    if first:
        first = False
    else:
        between_items()

    item()

This will work for any iterable, even for those that have no len() :这适用于任何可迭代对象,即使对于那些没有len()

file = open('/path/to/file')
for line in file:
    process_line(line)

    # No way of telling if this is the last line!

Apart from that, I don't think there is a generally superior solution as it depends on what you are trying to do.除此之外,我认为没有普遍优越的解决方案,因为这取决于您要尝试做什么。 For example, if you are building a string from a list, it's naturally better to use str.join() than using a for loop “with special case”.例如,如果您正在从列表构建一个字符串,那么使用str.join()自然比使用“具有特殊情况”的for循环更好。


Using the same principle but more compact:使用相同的原理但更紧凑:

for i, line in enumerate(data_list):
    if i > 0:
        between_items()
    item()

Looks familiar, doesn't it?看起来很熟悉是不是? :) :)


For @ofko, and others who really need to find out if the current value of an iterable without len() is the last one, you will need to look ahead:对于@ofko 和其他真正需要找出不带len()的可迭代对象的当前值是否是最后一个值的其他人,您需要向前看:

def lookahead(iterable):
    """Pass through all values from the given iterable, augmented by the
    information if there are more values to come after the current one
    (True), or if it is the last value (False).
    """
    # Get an iterator and pull the first value.
    it = iter(iterable)
    last = next(it)
    # Run the iterator to exhaustion (starting from the second value).
    for val in it:
        # Report the *previous* value (more to come).
        yield last, True
        last = val
    # Report the last value.
    yield last, False

Then you can use it like this:然后你可以像这样使用它:

>>> for i, has_more in lookahead(range(3)):
...     print(i, has_more)
0 True
1 True
2 False

Although that question is pretty old, I came here via google and I found a quite simple way: List slicing.虽然这个问题很老了,但我是通过谷歌来到这里的,我找到了一个非常简单的方法:列表切片。 Let's say you want to put an '&' between all list entries.假设您想在所有列表条目之间放置一个“&”。

s = ""
l = [1, 2, 3]
for i in l[:-1]:
    s = s + str(i) + ' & '
s = s + str(l[-1])

This returns '1 & 2 & 3'.这将返回“1 & 2 & 3”。

if the items are unique:如果项目是唯一的:

for x in list:
    #code
    if x == list[-1]:
        #code

other options:其他选项:

pos = -1
for x in list:
    pos += 1
    #code
    if pos == len(list) - 1:
        #code


for x in list:
    #code
#code - e.g. print x


if len(list) > 0:
    for x in list[:-1]
        #code
    for x in list[-1]:
        #code

The 'code between' is an example of the Head-Tail pattern. “代码之间”是头尾模式的一个例子。

You have an item, which is followed by a sequence of ( between, item ) pairs.您有一个项目,后面是一系列 ( between, item ) 对。 You can also view this as a sequence of (item, between) pairs followed by an item.您还可以将其视为一系列(项目,之间)对后跟一个项目。 It's generally simpler to take the first element as special and all the others as the "standard" case.通常将第一个元素视为特殊元素而将所有其他元素视为“标准”情况更简单。

Further, to avoid repeating code, you have to provide a function or other object to contain the code you don't want to repeat.此外,为了避免重复代码,您必须提供一个函数或其他对象来包含您不想重复的代码。 Embedding an if statement in a loop which is always false except one time is kind of silly.在循环中嵌入一个if语句,除了一次总是错误的,这有点愚蠢。

def item_processing( item ):
    # *the common processing*

head_tail_iter = iter( someSequence )
head = next(head_tail_iter)
item_processing( head )
for item in head_tail_iter:
    # *the between processing*
    item_processing( item )

This is more reliable because it's slightly easier to prove, It doesn't create an extra data structure (ie, a copy of a list) and doesn't require a lot of wasted execution of an if condition which is always false except once.这更可靠,因为它更容易证明,它不会创建额外的数据结构(即列表的副本),并且不需要大量浪费执行if条件,该条件除一次外始终为假。

If you're simply looking to modify the last element in data_list then you can simply use the notation:如果您只是想修改data_list的最后一个元素,那么您可以简单地使用表示法:

L[-1]

However, it looks like you're doing more than that.然而,看起来你做的远不止这些。 There is nothing really wrong with your way.你的方式没有什么问题。 I even took a quick glance at some Django code for their template tags and they do basically what you're doing.我什至快速浏览了一些Django 代码的模板标签,它们基本上完成了你正在做的事情。

This is similar to Ants Aasma's approach but without using the itertools module.这类似于 Ants Aasma 的方法,但不使用 itertools 模块。 It's also a lagging iterator which looks-ahead a single element in the iterator stream:它也是一个滞后迭代器,它向前看迭代器流中的单个元素:

def last_iter(it):
    # Ensure it's an iterator and get the first field
    it = iter(it)
    prev = next(it)
    for item in it:
        # Lag by one item so I know I'm not at the end
        yield 0, prev
        prev = item
    # Last item
    yield 1, prev

def test(data):
    result = list(last_iter(data))
    if not result:
        return
    if len(result) > 1:
        assert set(x[0] for x in result[:-1]) == set([0]), result
    assert result[-1][0] == 1

test([])
test([1])
test([1, 2])
test(range(5))
test(xrange(4))

for is_last, item in last_iter("Hi!"):
    print is_last, item

you can determine the last element with this code :您可以使用此代码确定最后一个元素:

for i,element in enumerate(list):
    if (i==len(list)-1):
        print("last element is" + element)

You can use a sliding window over the input data to get a peek at the next value and use a sentinel to detect the last value.您可以在输入数据上使用滑动窗口来查看下一个值,并使用标记来检测最后一个值。 This works on any iterable, so you don't need to know the length beforehand.这适用于任何可迭代对象,因此您无需事先知道长度。 The pairwise implementation is from itertools recipes .成对实现来自itertools recipes

from itertools import tee, izip, chain

def pairwise(seq):
    a,b = tee(seq)
    next(b, None)
    return izip(a,b)

def annotated_last(seq):
    """Returns an iterable of pairs of input item and a boolean that show if
    the current item is the last item in the sequence."""
    MISSING = object()
    for current_item, next_item in pairwise(chain(seq, [MISSING])):
        yield current_item, next_item is MISSING:

for item, is_last_item in annotated_last(data_list):
    if is_last_item:
        # current item is the last item

Is there no possibility to iterate over all-but the last element, and treat the last one outside of the loop?是否有可能遍历除最后一个元素之外的所有元素,并在循环之外处理最后一个元素? After all, a loop is created to do something similar to all elements you loop over;毕竟,创建了一个循环来执行类似于您循环的所有元素的操作; if one element needs something special, it shouldn't be in the loop.如果一个元素需要一些特殊的东西,它不应该在循环中。

(see also this question: does-the-last-element-in-a-loop-deserve-a-separate-treatment ) (另见这个问题: dos-the-the-last-element-in-a-loop-deserve-a-separate-treatment

EDIT: since the question is more about the "in between", either the first element is the special one in that it has no predecessor, or the last element is special in that it has no successor.编辑:由于问题更多是关于“中间”,所以第一个元素是特殊的,因为它没有前任,或者最后一个元素是特殊的,因为它没有后继。

I like the approach of @ethan-t, but while True is dangerous from my point of view.我喜欢@ethan-t 的方法,但从我的角度来看while True是危险的。

data_list = [1, 2, 3, 2, 1]  # sample data
L = list(data_list)  # destroy L instead of data_list
while L:
    e = L.pop(0)
    if L:
        print(f'process element {e}')
    else:
        print(f'process last element {e}')
del L

Here, data_list is so that last element is equal by value to the first one of the list.在这里, data_list使得最后一个元素在值上等于列表中的第一个元素。 L can be exchanged with data_list but in this case it results empty after the loop. L 可以与data_list交换,但在这种情况下,循环后结果为空。 while True is also possible to use if you check that list is not empty before the processing or the check is not needed (ouch!).如果您在处理之前检查列表不为空或不需要检查(哎哟!),则也可以使用while True

data_list = [1, 2, 3, 2, 1]
if data_list:
    while True:
        e = data_list.pop(0)
        if data_list:
            print(f'process element {e}')
        else:
            print(f'process last element {e}')
            break
else:
    print('list is empty')

The good part is that it is fast.好的部分是它很快。 The bad - it is destructible ( data_list becomes empty).不好的 - 它是可破坏的( data_list变为空)。

Most intuitive solution:最直观的解决方案:

data_list = [1, 2, 3, 2, 1]  # sample data
for i, e in enumerate(data_list):
    if i != len(data_list) - 1:
        print(f'process element {e}')
    else:
        print(f'process last element {e}')

Oh yes, you have already proposed it!哦,是的,你已经提出了!

There is nothing wrong with your way, unless you will have 100 000 loops and wants save 100 000 "if" statements.您的方式没有任何问题,除非您将有 100 000 个循环并希望保存 100 000 个“if”语句。 In that case, you can go that way :在这种情况下,您可以这样做:

iterable = [1,2,3] # Your date
iterator = iter(iterable) # get the data iterator

try :   # wrap all in a try / except
    while 1 : 
        item = iterator.next() 
        print item # put the "for loop" code here
except StopIteration, e : # make the process on the last element here
    print item

Outputs :输出:

1
2
3
3

But really, in your case I feel like it's overkill.但实际上,在你的情况下,我觉得这太过分了。

In any case, you will probably be luckier with slicing :无论如何,你可能会更幸运地切片:

for item in iterable[:-1] :
    print item
print "last :", iterable[-1]

#outputs
1
2
last : 3

or just :要不就 :

for item in iterable :
    print item
print iterable[-1]

#outputs
1
2
3
last : 3

Eventually, a KISS way to do you stuff, and that would work with any iterable, including the ones without __len__ :最终,一种 KISS 方式来做你的事情,这将适用于任何迭代,包括那些没有__len__

item = ''
for item in iterable :
    print item
print item

Ouputs:输出:

1
2
3
3

If feel like I would do it that way, seems simple to me.如果觉得我会那样做,对我来说似乎很简单。

Use slicing and is to check for the last element:使用切片和is检查的最后一个元素:

for data in data_list:
    <code_that_is_done_for_every_element>
    if not data is data_list[-1]:
        <code_that_is_done_between_elements>

Caveat emptor : This only works if all elements in the list are actually different (have different locations in memory).警告 emptor :这仅在列表中的所有元素实际上都不同(在内存中具有不同的位置)时才有效。 Under the hood, Python may detect equal elements and reuse the same objects for them.在幕后,Python 可能会检测到相同的元素并为它们重用相同的对象。 For instance, for strings of the same value and common integers.例如,对于具有相同值和公共整数的字符串。

Google brought me to this old question and I think I could add a different approach to this problem.谷歌把我带到了这个老问题,我想我可以为这个问题添加不同的方法。

Most of the answers here would deal with a proper treatment of a for loop control as it was asked, but if the data_list is destructible, I would suggest that you pop the items from the list until you end up with an empty list:这里的大多数答案都会按照要求处理对 for 循环控制的正确处理,但是如果 data_list 是可破坏的,我建议您从列表中弹出项目,直到最终得到一个空列表:

while True:
    element = element_list.pop(0)
    do_this_for_all_elements()
    if not element:
        do_this_only_for_last_element()
        break
    do_this_for_all_elements_but_last()

you could even use while len(element_list) if you don't need to do anything with the last element.如果您不需要对最后一个元素做任何事情,您甚至可以使用while len(element_list) I find this solution more elegant then dealing with next().我发现这个解决方案比处理 next() 更优雅。

Better late than never.迟到总比不到好。 Your original code used enumerate() , but you only used the i index to check if it's the last item in a list.您的原始代码使用enumerate() ,但您只使用i索引来检查它是否是列表中的最后一项。 Here's an simpler alternative (if you don't need enumerate() ) using negative indexing:这是使用负索引的更简单的替代方法(如果您不需要enumerate() ):

for data in data_list:
    code_that_is_done_for_every_element
    if data != data_list[-1]:
        code_that_is_done_between_elements

if data != data_list[-1] checks if the current item in the iteration is NOT the last item in the list. if data != data_list[-1]检查迭代中的当前项是否不是列表中的最后一项。

Hope this helps, even nearly 11 years later.希望这会有所帮助,即使是在将近 11 年后。

We can achieve that using for-else我们可以使用for-else来实现

cities = [
  'Jakarta',
  'Surabaya',
  'Semarang'
]

for city in cities[:-1]:
  print(city)
else:
  print(' '.join(cities[-1].upper()))

output:输出:

Jakarta
Surabaya
S E M A R A N G

The idea is we only using for-else loops until n-1 index, then after the for is exhausted, we access directly the last index using [-1] .这个想法是我们只使用for-else循环直到n-1索引,然后在for用完之后,我们使用[-1]直接访问最后一个索引。

if you are going through the list, for me this worked too:如果您正在浏览列表,对我来说这也有效:

for j in range(0, len(Array)):
    if len(Array) - j > 1:
        notLast()

For me the most simple and pythonic way to handle a special case at the end of a list is:对我来说,处理列表末尾特殊情况的最简单和 Pythonic 的方法是:

for data in data_list[:-1]:
    handle_element(data)
handle_special_element(data_list[-1])

Of course this can also be used to treat the first element in a special way .当然,这也可以用于以特殊方式处理第一个元素。

Instead of counting up, you can also count down:除了向上计数,您还可以向下计数:

  nrToProcess = len(list)
  for s in list:
    s.doStuff()
    nrToProcess -= 1
    if nrToProcess==0:  # this is the last one
      s.doSpecialStuff()

Delay the special handling of the last item until after the loop.将最后一项的特殊处理延迟到循环之后。

>>> for i in (1, 2, 3):
...     pass
...
>>> i
3

There can be multiple ways.可以有多种方式。 slicing will be fastest.切片将是最快的。 Adding one more which uses .index() method:添加一个使用 .index() 方法的:

>>> l1 = [1,5,2,3,5,1,7,43]                                                 
>>> [i for i in l1 if l1.index(i)+1==len(l1)]                               
[43]

One simple solution that comes to mind would be:想到的一种简单解决方案是:

for i in MyList:
    # Check if 'i' is the last element in the list
    if i == MyList[-1]:
        # Do something different for the last
    else:
        # Do something for all other elements

A second equally simple solution could be achieved by using a counter:使用计数器可以实现第二个同样简单的解决方案:

# Count the no. of elements in the list
ListLength = len(MyList)
# Initialize a counter
count = 0

for i in MyList:
    # increment counter
    count += 1
    # Check if 'i' is the last element in the list
    # by using the counter
    if count == ListLength:
        # Do something different for the last
    else:
        # Do something for all other elements

Just check if data is not the same as the last data in data_list ( data_list[-1] ).只需检查数据是否与 data_list ( data_list[-1] ) 中的最后一个数据不同。

for data in data_list:
    code_that_is_done_for_every_element
    if data != data_list[- 1]:
        code_that_is_done_between_elements

Assuming input as an iterator, here's a way using tee and izip from itertools:假设输入作为迭代器,这里有一种使用 itertools 中的 tee 和 izip 的方法:

from itertools import tee, izip
items, between = tee(input_iterator, 2)  # Input must be an iterator.
first = items.next()
do_to_every_item(first)  # All "do to every" operations done to first item go here.
for i, b in izip(items, between):
    do_between_items(b)  # All "between" operations go here.
    do_to_every_item(i)  # All "do to every" operations go here.

Demo:演示:

>>> def do_every(x): print "E", x
...
>>> def do_between(x): print "B", x
...
>>> test_input = iter(range(5))
>>>
>>> from itertools import tee, izip
>>>
>>> items, between = tee(test_input, 2)
>>> first = items.next()
>>> do_every(first)
E 0
>>> for i,b in izip(items, between):
...     do_between(b)
...     do_every(i)
...
B 0
E 1
B 1
E 2
B 2
E 3
B 3
E 4
>>>

The most simple solution coming to my mind is:我想到的最简单的解决方案是:

for item in data_list:
    try:
        print(new)
    except NameError: pass
    new = item
print('The last item: ' + str(new))

So we always look ahead one item by delaying the the processing one iteration.所以我们总是通过延迟处理一次迭代来向前看一项。 To skip doing something during the first iteration I simply catch the error.为了在第一次迭代期间跳过做某事,我只是捕获错误。

Of course you need to think a bit, in order for the NameError to be raised when you want it.当然,您需要考虑一下,以便在需要时引发NameError

Also keep the `counstruct还要保持`结构

try:
    new
except NameError: pass
else:
    # continue here if no error was raised

This relies that the name new wasn't previously defined.这依赖于先前未定义名称 new。 If you are paranoid you can ensure that new doesn't exist using:如果您是偏执狂,您可以使用以下方法确保new不存在:

try:
    del new
except NameError:
    pass

Alternatively you can of course also use an if statement ( if notfirst: print(new) else: notfirst = True ).或者,您当然也可以使用 if 语句( if notfirst: print(new) else: notfirst = True )。 But as far as I know the overhead is bigger.但据我所知,开销更大。


Using `timeit` yields:

    ...: try: new = 'test' 
    ...: except NameError: pass
    ...: 
100000000 loops, best of 3: 16.2 ns per loop

so I expect the overhead to be unelectable.所以我预计开销是无法选择的。

Count the items once and keep up with the number of items remaining:计算一次物品并跟上剩余物品的数量:

remaining = len(data_list)
for data in data_list:
    code_that_is_done_for_every_element

    remaining -= 1
    if remaining:
        code_that_is_done_between_elements

This way you only evaluate the length of the list once.这样您只需评估列表的长度一次。 Many of the solutions on this page seem to assume the length is unavailable in advance, but that is not part of your question.此页面上的许多解决方案似乎都假设长度提前不可用,但这不是您问题的一部分。 If you have the length, use it.如果您有长度,请使用它。

So, this is definitely not the "shorter" version - and one might digress if "shortest" and "Pythonic" are actually compatible.所以,这绝对不是“较短”的版本——如果“最短”和“Pythonic”实际上兼容,人们可能会离题。

But if one needs this pattern often, just put the logic in to a 10-liner generator - and get any meta-data related to an element's position directly on the for call.但是,如果经常需要这种模式,只需将逻辑放入 10 行生成器 - 并直接在for调用中获取与元素位置相关的任何元数据。 Another advantage here is that it will work wit an arbitrary iterable, not only Sequences.这里的另一个优点是它可以与任意迭代器一起工作,而不仅仅是序列。

_sentinel = object()

def iter_check_last(iterable):
    iterable = iter(iterable)
    current_element = next(iterable, _sentinel)
    while current_element is not _sentinel:
        next_element = next(iterable, _sentinel)
        yield (next_element is _sentinel, current_element)
        current_element = next_element
In [107]: for is_last, el in iter_check_last(range(3)):
     ...:     print(is_last, el)
     ...: 
     ...: 
False 0
False 1
True 2

I will provide with a more elegant and robust way as follows, using unpacking:我将提供一个更优雅和健壮的方式如下,使用解包:

def mark_last(iterable):
    try:
        *init, last = iterable
    except ValueError:  # if iterable is empty
        return

    for e in init:
        yield e, True
    yield last, False

Test:测试:

for a, b in mark_last([1, 2, 3]):
    print(a, b)

The result is:结果是:

1 True 1 真
2 True 2 真
3 False 3 错误

This is an old question, and there's already lots of great responses, but I felt like this was pretty Pythonic:这是一个老问题,已经有很多很好的回答,但我觉得这很 Pythonic:

def rev_enumerate(lst):
    """
    Similar to enumerate(), but counts DOWN to the last element being the
    zeroth, rather than counting UP from the first element being the zeroth.

    Since the length has to be determined up-front, this is not suitable for
    open-ended iterators.

    Parameters
    ----------
    lst : Iterable
        An iterable with a length (list, tuple, dict, set).

    Yields
    ------
    tuple
        A tuple with the reverse cardinal number of the element, followed by
        the element of the iterable.
    """
    length = len(lst) - 1
    for i, element in enumerate(lst):
        yield length - i, element

Used like this:像这样使用:

for num_remaining, item in rev_enumerate(['a', 'b', 'c']):
    if not num_remaining:
        print(f'This is the last item in the list: {item}')

Or perhaps you'd like to do the opposite:或者你可能想做相反的事情:

for num_remaining, item in rev_enumerate(['a', 'b', 'c']):
    if num_remaining:
        print(f'This is NOT the last item in the list: {item}')

Or, just to know how many remain as you go...或者,只是想知道还剩多少……

for num_remaining, item in rev_enumerate(['a', 'b', 'c']):
    print(f'After {item}, there are {num_remaining} items.')

I think the versatility and familiarity with the existing enumerate makes it most Pythonic.我认为对现有enumerate的多功能性和熟悉性使它最 Pythonic。

Caveat, unlike enumerate() , rev_enumerate() requires that the input implement __len__ , but this includes lists, tuples, dicts and sets just fine.注意,与enumerate()不同, rev_enumerate()要求输入实现__len__ ,但这包括列表、元组、字典和集合就好了。

If you are looping the List , Using enumerate function is one of the best try.如果您正在循环List ,使用enumerate函数是最好的尝试之一。

for index, element in enumerate(ListObj):
    # print(index, ListObj[index], len(ListObj) )

    if (index != len(ListObj)-1 ):
        # Do things to the element which is not the last one
    else:
        # Do things to the element which is the last one

If you are happy to be destructive with the list, then there's the following.如果您乐于对列表进行破坏,那么有以下内容。

while data_list:
   value = data_list.pop(0)
   code_that_is_done_for_every_element(value)
   if data_list:
       code_that_is_done_between_elements(value)
   else:
       code_that_is_done_for_last_element(value)


This works well with empty lists, and lists of non-unique items.这适用于空列表和非唯一项目列表。 Since it's often the case that lists are transitory, this works pretty well ... at the cost of destructing the list.由于列表通常是暂时的,因此这很有效......以破坏列表为代价。

I have found it convenient to define the loop value before the loop expresion ie.我发现在循环表达式之前定义循环值很方便,即。 for my box example, then match the value in the loop, or wherever else you may need it.对于我的盒子示例,然后匹配循环中的值,或者您可能需要的任何其他地方。

numberofboxes = 1411盒数 = 1411

for j in range(1,numberofboxes):对于范围内的 j (1,numberofboxes):

if j != numberofboxes - 1:
    print ("},")
else:
    print("}")

I've shared two simple methods below to find the end of the loop.我在下面分享了两种简单的方法来找到循环的结尾。

Method 1:方法一:

num_list = [1, 2, 3, 4]

for n in num_list:
    if num_list[-1] == n:
        print('this is the last iteration of the loop')

Method 2:方法二:

num_list = [1, 2, 3, 4]

loop_count = len(num_list) - 1  # 3
for index, num in enumerate(num_list):
    if index == loop_count:
        print('this is the last iteration of the loop')

I just came across this question and my generic solution uses an Iterator:我刚刚遇到了这个问题,我的通用解决方案使用了一个迭代器:

from typing import TypeVar, Iterable
E = TypeVar('E')

def metait(i: Iterable[E]) -> Iterable[tuple[E, bool, bool]]:

    first = True
    previous = None
    for elem in i:
        if previous:
            yield previous, first, False
            first = False
        previous = elem

    if previous:
        yield previous, first, True

you will receive a tuple with the original elements and flags for the first and last item.您将收到一个元组,其中包含第一项和最后一项的原始元素和标志。 It can be used with every iterable:它可以与每个可迭代对象一起使用:

d = {'a': (1,2,3), 'b': (4,5,6), 'c': (7,8,9)}

for (k,v), is_first, is_last in metait(d.items()):
    print(f'{k}: {v}  {is_first} {is_last}')

This will give you:这会给你:

a: (1, 2, 3)  True False
b: (4, 5, 6)  False False
c: (7, 8, 9)  False True

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM