所以我目前有一个逆时针旋转矩阵的功能,列表始终是一个正方形网格:
def rotate(m: List[List[int]]) -> None:
temp = m.copy()
if len(m) > 1:
for x in range(len(m)):
for y in range(len(m)):
temp[len(m)-1-y][x] = m[x][y]
m = temp.copy()
我已经反复跟踪了此功能,据我所知它应该正常工作。问题在于,由于某种原因,对温度的每次更改都会影响原始列表。例如,
ORIGINAL =
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
WHAT SHOULD OUTPUT =
[[3, 6, 9],
[2, 5, 8],
[1, 4, 7]]
WHAT ACTUALLY OUTPUTS =
[[3, 6, 1],
[2, 5, 2],
[1, 2, 1]
我在python ver 3.7.0上运行,并且尝试过滑动而不是复制字符串,但是发生了相同的事情。有人知道为什么吗?
答案 0 :(得分:3)
由于m
列表中的每个项目都是对子列表的引用,因此当您通过调用m
复制m.copy()
列表的副本时,它仅复制该列表的引用。子列表,而无需创建子列表的新副本,这就是对temp
列表所做的每个更改都反映在原始m
列表上的原因。
您还应该使用copy.deepcopy()
来制作子列表的副本:
from copy import deepcopy
def rotate(m):
temp = deepcopy(m)
if len(m) > 1:
for x in range(len(m)):
for y in range(len(m)):
temp[len(m)-1-y][x] = m[x][y]
return temp
这样:
rotate([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
返回:
[[3, 6, 9],
[2, 5, 8],
[1, 4, 7]]
或者,您可以通过压缩列表列表并将其反转来实现相同的矩阵旋转:
def rotate(m):
return list(zip(*m))[::-1]
答案 1 :(得分:0)
exports.observeMessages = functions.database.ref('/conversation_messages/{topicId}/{messageId}')
.onCreate((snapshot, context) => {
var topic = context.params.topicId;
var messageId = context.params.messageId;
var message = snapshot.val();
return admin.database().ref('/conversations/' + topic).once('value', snapshot => {
var conversation = snapshot.val(); // This gives us the conversation name
return admin.database().ref('/users/' + message.senderId).once('value', snapshot => {
var user = snapshot.val();
var notification = {
notification: {
title: conversation.conversationName,
body: user.username + ': ' + message.text
},
apns: {
payload: {
aps: {
sound: 'default'
}
}
},
data: {
conversationId: topic
},
topic: topic
};
admin.messaging().send(notification)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:' + notification + 'to topic: ' + topic, response);
return response
})
.catch((error) => {
console.log('Error sending message:', error);
throw new Error("Error sending message");
});
})
})
})
所以:
import copy
def rotate(m: [[int]]):
temp = copy.deepcopy(m)
if len(m) > 1:
for x in range(len(m)):
for y in range(len(m)):
temp[len(m)-1-y][x] = m[x][y]
return temp
输出:
rotate([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])