Python 3.3.4。如何交换数组中的值

时间:2015-06-03 15:09:26

标签: python arrays algorithm

好的,所以我今天参加了我的GCSE计算机科学考试,但我无法完成最后一个问题,因为我觉得这太过艰难了。我不记得问题的确切措辞,但我确实记得它的要求。因此,有一个由6人组成的阵列,然后用户可以输入每个玩家将移动多少个位置。然后我必须创建一个算法,该算法将在每次移动后更新每个人在阵列中的位置数组。问题是这些人坐在桌子旁边,他们的座位从1-6开始编号,所以如果他们都移动了2个空格,那么6人将在座位2中,当然他们排在第二位。因为这个问题让我烦恼不已,所以我回到家看看是否可以使用python创建算法。

以下是我提出的建议:

array = ["susan", "mary", "david", "tom", "richard", "mark"]

places_moved = int(input("How many places would you like to move?"))

for i in range (0,6):
    if i + places_moved > 5:
        array[i] = (array[i + places_moved - 6])
    print (array[i])
else:
    array[i] = (array[i + places_moved])
        print (array[i])

正如您所看到的,这实际上并没有实际更新数组,因为这只是我的第一个方法,看看我是否可以打印出新的数组值。但是,我甚至没能成功,因为代码只会改变正在打印的数组,并且不会改变数组数据的位置。

这很难解释,所以我对答案感到怀疑,但如果我确实有任何意义,我非常感谢有人能给我一个有效的算法吗?对于给出的问题。谢谢伙计们/加尔斯!

4 个答案:

答案 0 :(得分:1)

如果你想要在列表中交换两个元素:

seq[i], seq[j] = seq[j], seq[i]

如果你想“旋转”一个列表,这样每个元素都离它的起点有一段距离:

seq = [seq[(i + distance_to_move) % len(seq)] for i in range(len(seq))] 

答案 1 :(得分:1)

这是一个解决方案。唯一的“技巧”是使用模运算符将座位限制为0 ... 5。此外,该公式增加了6,以避免产生负座位数。

<div class="container">
    <div class="row">
        <div class="col-md-3">
          <form class="form-inline">
            <div class="form-group col-md-7">
              <div class="input-group">
                  <input type="text" class="form-control input-sm" placeholder="Search Ticket">
                  <span class="input-group-btn">
                       <button class="btn btn-default btn-sm btn-default-gradient" type="button">
                           <i class="glyphicon glyphicon-search"></i>
                       </button>
                  </span>
              </div>
            </div>
            <button type="button" class="btn btn-default btn-sm btn-default-gradient col-md-5">
                <span class="glyphicon glyphicon" aria-hidden="true"></span> Search Tools
            </button>
          </form>
        </div>
        <div class="col-md-3"></div>
        <div class="col-md-3">
            <button type="button" class="btn btn-default btn-sm btn-default-gradient pull-right">
                <span class="glyphicon glyphicon" aria-hidden="true"></span> New Ticket
            </button>
        </div>
    </div>
</div>

(只是观察:数组不是数组,但在这种情况下是列表) 在此之后,如果您愿意,可以将new_list分配给数组:

def main():
    array = ["susan", "mary", "david", "tom", "richard", "mark"]

    places_moved = int(input("How many places would you like to move?\n" + \
                             "(positive is to the right) "))

    new_list = []
    for seat in range(6):
        new_list.append(array[(seat + 6 - places_moved) % 6])

    print new_list

    return 0

if __name__ == '__main__':
    main()

而且,对于那些不想使用额外变量的纯粹主义者,(甚至是模数!):)

array = copy.deepcopy(new_list)

答案 2 :(得分:0)

@jcoppens:Python与负面索引完美配合。例如array [-1]给出最后一个元素。

new_list.append(array[(seat + places_moved) % len(array)])

应该没事。

答案 3 :(得分:0)

您可以使用模数或余数运算符%将新索引保持在数组长度的范围内,并使用列表推导来更新数组:

array = ["susan", "mary", "david", "tom", "richard", "mark"]

places_moved = int(input("How many places would you like to move?"))
length = len(array)

array = [array[(i+places_moved) % length] for i, elem in enumerate(array)]
print(array)
相关问题