Py学习  »  Barmar  »  全部回复
回复总数  62
5 年前
回复了 Barmar 创建的主题 » 如何在python中循环遍历大型嵌套列表?

使用嵌套循环。

for l1 in geojson['geometry_coordinates']:
    for l2 in l1:
        for l3 in l2:
            lon.append(l3[0])
            lat.append(l3[1])
5 年前
回复了 Barmar 创建的主题 » Python搜索2d数组并返回if found和index found

不要压平二维列表。使用嵌套循环 enumerate() 所以你可以得到索引。

def find_in_2d(lists, value):
    for i, l in enumerate(lists):
        for j, item in enumerate(l):
            if item == value:
                return i, j
    return None, None

i, j = find_in_2d(assets, element.get("asset")
if i is not None:
    print("found updating")
    asset[i][j] = new_value
6 年前
回复了 Barmar 创建的主题 » MySQL:对整个表应用按查询分组

连接两个表并按两列分组。

SELECT cr.register_id, cr.number, COUNT(*) AS cnt
FROM tbl_cross AS cr
JOIN tbl_register as r ON cr.register_id = r.id
WHERE r.collection_id = 56
GROUP BY register_id, number
HAVING cnt > 1

你可以用 HAVING 若要筛选出不重复项,不需要子查询。

5 年前
回复了 Barmar 创建的主题 » JQuery:使用setInterval以随机秒数显示文本

使用 setTimeout() 运行下一个迭代,而不是 setInterval() ,每次随机计算超时时间。

(function() {
  var timesRun = 0;
  var runLimit = 10;

  i = 0;

  function updateCounter() {
    if (timesRun < runLimit) {
      var timeout = 2000 * Math.random() + 1000; // random timeout from 1000 to 3000
      setTimeout(function() {
        $('#changing-number').fadeOut(function() {
          $(this).html(timesRun).fadeIn();
        });
        timesRun++;
        updateCounter();
      }, timeout);
    }
  }
  updateCounter();
})();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<span id="changing-number">0</span> out of 10 numbers have been displayed.
6 年前
回复了 Barmar 创建的主题 » 更新时出现MySQL错误1157,但是我在where子句中使用主键

仅仅使用键列是不够的,您必须以允许使用索引来查找行的方式使用它。从 documentation :

如果优化器决定不对键列使用索引,则UPDATE和DELETE语句可能在安全更新模式下产生错误,即使在WHERE子句中指定了键。

因为你在测试 BINARY ip_ip 而不仅仅是 ip_ip 它本身不能使用索引,所以您会得到错误。

你能用一个函数来转换 INET6_ATON() varbinary ,而不是使用 BINARY 专栏的接线员然后它应该能够使用索引,并且不会出现错误。

UPDATE ip 
SET 
    ip_countryCode = 'GB',
    ip_countryName = 'United Kingdom',
    ip_city = 'London' 

WHERE ip_ip BETWEEN CAST(INET6_ATON('2.57.77.0') AS BINARY(16)) AND 
                    CAST(INET6_ATON('2.57.77.255') AS BINARY(16);
6 年前
回复了 Barmar 创建的主题 » 线程中的python socket recv

你必须通过 listen 函数到 threading.Thread() 是的。在主线程中调用函数,等待它完成,然后传递它的返回值(即 None ,因为函数从不返回任何内容)。

t2 = threading.Thread(target = listen)
6 年前
回复了 Barmar 创建的主题 » mysql在一列上匹配重复项,而在另一列上只匹配不同项

添加 GROUP BY A.Name, A.Score 到最后,你只能得到一行的名字和分数的每个组合。

如果你只想在同一个部门有两个不同的分数时给他们看,用 COUNT(DISTINCT Score) 而不是 COUNT(*) 是的。

SELECT A.UserID, A.DeptID, A.Name, A.Score
FROM User AS A
INNER JOIN (
    SELECT Name, DeptID
    FROM User
    GROUP BY Name, DeptID
    HAVING COUNT(DISTINCT Score) > 1
) AS B ON A.Name = B.Name AND A.DeptID = B.DeptID
GROUP BY A.Name, A.Score

第一, import_csv 不应该将列表包装到另一个列表中,它应该只返回行列表。

def import_csv(csv_file):
    name_entries = []
    with open(csv_file) as csvfile:
        reader = csv.reader(csvfile)
        return list(reader)

其次, exclude_entries 不需要使用 csv ,在导入数据时已使用,并且 name_entries 是行的列表。

第三,您应该只匹配包含电子邮件地址的list元素。

你可以用 filter() 过滤列表,而不是循环。

def exclude_regex_users(name_entries):
    r = re.compile(r'\w+\+\d+@trellis\.law')
    pulled_names = filter(lambda row: r.match(row[6]) or r.match(row[9]), name_entries)

    print(pulled_names)
5 年前
回复了 Barmar 创建的主题 » 使用join mysql时字段列表中的未知列

子查询没有返回 campaign_code 列。此外,还需要使用子查询的别名。

SELECT pm.*, cp.campaign_code
FROM dmspro_mys_product_master AS pm
INNER JOIN (
    SELECT DISTINCT product_id, campaign_code
    FROM dmspro_mys_campaign_product) AS cp
ON cp.product_id = pm.product_id
5 年前
回复了 Barmar 创建的主题 » 使用newline和linux mail命令通过pythons子进程发送邮件

你需要把身体和主题用引号引起来。如果你用F字串就容易多了

cmd  = f"echo '{body}' | mail -s '{subject}' -r '{fromAddr}' '{toAddr}'"

注意,您需要确保在任何参数中都没有引号字符——确保密码中不允许使用单引号。

10 年前
回复了 Barmar 创建的主题 » python和函数返回[duplicate]

您没有使用递归调用的返回值。你需要做的是:

return load_price();

这可以用3个SQL查询来完成:

INSERT INTO company (companyname)
SELECT DISTINCT companyname
FROM originalTable;

INSERT INTO store (storelocation, storenumber, companyid)
SELECT DISTINCT o.storelocation, o.storenumber, c.companyid
FROM originalTable o
JOIN company c ON o.companyname = c.companyname;

INSERT INTO item (itemname, itemmodel, storeid)
SELECT o.itemname, o.itemmodel, s.storeid
FROM originalTable o
JOIN store s ON s.storelocation = o.storelocation AND s.storenumber = o.storenumber
JOIN company c ON s.companyid = s.companyid AND o.companyname = c.companyname;

加入 company 在第三查询是必要的,如果原来的表可以重复的位置+存储从不同的公司存储。

6 年前
回复了 Barmar 创建的主题 » 如何检测TCP客户端何时与Python的选择(?)断开连接?

当你使用keepalive,它检测到失败时, select() 应将套接字报告为可读和可写。然后,当您尝试执行其中一个操作时,应该会得到一个错误。使用 try/except 周围 s.recv() 调用以检测 socket.error .

您可能天真地假设这将被报告为“异常情况”,但事实并非如此。这用于有效套接字上的正常异常,例如带外数据。

6 年前
回复了 Barmar 创建的主题 » 如何查看mysql dump的进程?

使用 -v 生成详细输出的选项。它将显示正在执行的每个查询。

mysql -v --defaults-file=/apps/mysql/instance/db01/my.cnf-UTIL < abc.sql

你也可以使用 -vv -vvv 在输出中添加越来越多的详细信息,例如受影响的行数和查询所花费的时间。

6 年前
回复了 Barmar 创建的主题 » jquery针对这个和类

使用 .find() 在您要瞄准的单元格中,而不是当前单元格中。

value = jQuery(this).closest('td').prev('td').prev('td').find(".amount").text();
6 年前
回复了 Barmar 创建的主题 » mysql查询以检索两个用户之间的对话

你需要使用 AND 合并发件人和收件人,以及 OR 把不同的方向结合起来。

SELECT privatemessage_message, privatemessage_time_created, privatemessage_sent_by, privatemessage_sent_to 
FROM tbl_privatemessages 
WHERE (privatemessage_sent_by = 1 AND privatemessage_sent_to = 2)
   OR (privatemessage_sent_to = 1 AND privatemessage_sent_by = 2)
ORDER BY privatemessage_time_created ASC

license_name 是字符串,不是字典。你想测试一下 server 在嵌套字典中。

你可以使用 if license_name in time ,你不需要使用 time.keys() .

你不需要所有的 setdefault() 打电话来,只要按你的要求创建新字典就行了。你可以用它把所有的代码压缩成一行。

file = open('/user_log.csv', "r")
reader= csv.reader(file)
next(reader, None) # Skip the header line
time={}
for row in reader:
    license_name = row[2]
    server = row[1]

    if licence_name in time:
        if server in time[licence_name]:
            time[licence_name][server]['count'] += 1
        else:
            time[licence_name][server] = {"count": 1}
    else:
        time[licence_name] = { server: { "count": 1 } }

return render(request, "stats.html", {'no_of_line':time})

价值 time 我得到了这个代码和示例csv文件是:

{'NX12100N': {'server3': {'count': 2}},
 'NX12100N_gateway': {'server3': {'count': 2}},
 'NX12100N_solid_modeling': {'server3': {'count': 2}},
 'teamcenter_author': {'server1': {'count': 2}},
 'teamcenter_consumer': {'server1': {'count': 5}, 'server2': {'count': 1}},
 'visview_base': {'server1': {'count': 7}}}
6 年前
回复了 Barmar 创建的主题 » mysql-用子查询中的关键字/值替换文本

使用 REPLACE() 连接两个表后的函数。

SELECT REPLACE(t1.textfield, t2.key, t2.value) AS new_textfield
FROM Table1 AS t1
JOIN Table2 AS t2 ON LOCATE(t1.textfield, t2.key) != 0

请注意,一次只能对一个占位符起作用。如果一个文本字段包含多个占位符,则每次替换都会得到不同的结果行,它们不会合并。

我想你可以用 recursive CTE ,但cte只在mysql 8.0中才可用,我对它们并不熟悉。据我所知,递归CTE除了返回最终的组合替换之外,还将返回所有中间替换;我不确定如何过滤掉这些替换。

5 年前
回复了 Barmar 创建的主题 » 用python解析json txt文件

json.load() 期望文件只是一个长的json字符串。如果每行上都是单独的json字符串,则不能使用它。你需要阅读每一行并打电话 json.loads() .

import json
with open('movie_actors_data.txt') as f:
    data = list(map(json.loads, f))

data 将是字典列表。

如果你只想要一些属性,你可以使用列表理解。

with open('movie_actors_data.txt') as f:
    data = [{"title": x["title"], "imdb_id": x["imdb_id"]} for x in map(json.loads, f)]
7 年前
回复了 Barmar 创建的主题 » mysql连接表,即使条件失败[重复]

当你使用 LEFT JOIN 你必须把第二张桌子上的条件 ON 条款。把它们放进 WHERE 子句筛选出所有没有匹配项的行,因为这些列将 NULL 条件永远不会成功。

SELECT users.Name, users.ID, IFNULL(SUM(OnlineUseage.Minutes), 0) AS MinutesOnline
FROM UserTable
LEFT JOIN OnlineUseage ON OnlineUseage.ID = UserTable.ID
    AND OnlineUseage.Date >= '2016-01-01 00:00:00' AND OnlineUseage.Date <= '2016-12-31 23:59:59'
WHERE UserTable.ID IN(332,554,5764,11,556,.........)
GROUP BY UserTable.ID
ORDER BY FIELD(UserTable.ID, 332,554,5764,11,556,.........)
6 年前
回复了 Barmar 创建的主题 » mysql求和列总数

UNION 进入子查询。在主查询中,将所有计数和工资总额相加,然后使用 WITH ROLLUP 得到总数。

你不需要 dailySalary GROUP BY 子句,因为它在功能上依赖于id。

SELECT name AS Name, SUM(count) AS `Shows Attended in March`, SUM(totalSalary) AS `Total Salary`
FROM (
    SELECT Coach.name, COUNT(*) AS count, SUM(dailySalary) AS totalSalary
    FROM Coach
    JOIN CoachInShow ON Coach.idCoach=CoachInShow.idCoach
    JOIN TVShow ON TVShow.idShow = CoachInShow.idShow 
    WHERE monthname(dateOfShow)='March'
    GROUP BY Coach.idCoach

    UNION

    SELECT Participant.name, COUNT(*) AS count, SUM(dailySalary) AS totalSalary
    FROM Participant
    JOIN Contender ON Participant.idContender = Contender.idContender 
    JOIN ContenderInShow ON Contender.idContender = ContenderInShow.idContender
    JOIN TVShow ON ContenderInShow.idShow = TVShow.idShow
    WHERE monthname(dateOfShow)='March'
    GROUP BY Participant.idParticipant
) AS x
GROUP BY Name
WITH ROLLUP

DEMO

6 年前
回复了 Barmar 创建的主题 » mysql忽略check约束

看起来你真的想实现一个 ENUM :

type_of_passenger ENUM('child', 'student', 'senior')

默认情况下,mysql不验证枚举值,因此如果您尝试存储其他内容,它将存储一个空字符串,但如果启用了strict sql模式,它将报告一个错误。

另一种选择是将其作为输入有效值的表的外键。

CREATE TABLE passenger_types (
    type VARCHAR(20) NOT NULL PRIMARY KEY
);
INSERT INTO passenger_types (type) VALUES
('child'), ('student'), ('senior');


CREATE TABLE Fare (
    type_of_passenger varchar(20),
    price FLOAT,
    PRIMARY KEY (type_of_passenger),
    CONSTRAINT FOREIGN KEY (type_of_passenger) REFERENCES passenger_types (type)
);
5 年前
回复了 Barmar 创建的主题 » 将文件读入列表并用python中的值替换变量

把替换词放到字典里,然后打电话给 format() .

values = {'data1': 'line 1', 'data2': 'line 2'}
print([line.format(**values) for line in lines])
6 年前
回复了 Barmar 创建的主题 » jquery同步调用

执行中的第二个Ajax调用 success 第一个函数。

$.ajax({
  type: "POST",
  url: action,
  dataType: "html",
  success: function(result) {
    $('#dialogButtons').html(result).hide(); // Will show it after 2nd AJAX call
    $.ajax({
      type: "POST",
      dataType: "html",
      url: otheraction,
      success: function(result) {
        if (result) {
          $("#dialog").html(result);
          $("#dialogButtons").show();
        }
      }
    });
  },
  error: function(req, status, error) {
    alert(req + " " + error + " " + status);
  }
});

你也不应该 contentType: "application/json" . 您没有发送任何邮件数据,并且 $.ajax 不发送JSON;如果您有POST数据,它将被URL编码。

6 年前
回复了 Barmar 创建的主题 » 多栏mysql索引

只有在将测试与 AND OR 。当你有一个 条件,它必须独立地测试每个列,但复合索引是一个树,它具有 DNIS 在他们的关系中 ANI 。所以应该为每一列创建单独的索引。

MySQL通常也不擅长优化 查询。如果将其拆分为两个与之结合的查询,可能会更好 UNION :

SELECT ...
FROM call_data_report
WHERE ANI = 123456
UNION
SELECT ...
FROM call_data_report
WHERE DNIS = 123456
6 年前
回复了 Barmar 创建的主题 » 仅当选择count>n时才插入MySQL查询

你可以用 INSERT ... SELECT 并将条件置于 SELECT 查询。

INSERT INTO player (teamid, name)
SELECT @teamid, @playername
FROM DUAL
WHERE (SELECT COUNT(*) FROM player
        WHERE teamid = @teamid) < 20

DUAL 当需要选择文本数据,但需要在查询中包含其他子句时,是一个伪表。

6 年前
回复了 Barmar 创建的主题 » 在mysql左连接中,即使存在join,也如何带空值

您可以简单地添加 UNION 返回所需的所有空值的查询。

SELECT * FROM (
    SELECT DM.DEPT_NAME, DV.DIVISION_NAME, DM.DEPT_ID, DV.DIVISION_ID 
    FROM DEPARTMENT_MASTER DM 
    LEFT JOIN DIVISION_MASTER DV ON DM.DEPT_ID = DV.DEPT_ID
    UNION 
    SELECT DEPT_NAME, NULL, DEPT_ID, NULL
    FROM DEPARTMENT_MASTER) AS x
ORDER BY DEPT_NAME, DIVISION_NAME

但在这种情况下,你最好使用 INNER JOIN ,因为 联合 将为匹配行和不匹配行添加空行。

SELECT * FROM (
    SELECT DM.DEPT_NAME, DV.DIVISION_NAME, DM.DEPT_ID, DV.DIVISION_ID 
    FROM DEPARTMENT_MASTER DM 
    INNER JOIN DIVISION_MASTER DV ON DM.DEPT_ID = DV.DEPT_ID
    UNION ALL
    SELECT DEPT_NAME, NULL, DEPT_ID, NULL
    FROM DEPARTMENT_MASTER) AS x
ORDER BY DEPT_NAME, DIVISION_NAME
6 年前
回复了 Barmar 创建的主题 » 用jquery自动选择

这应该有效:

$(".per-businessHour").on("change", ".closing_time", function() {
    $(".closing_time").val(this.value);
});

这将使用事件委托,因此动态更改类会更改事件处理程序是否运行。单击“编辑”按钮时,它将删除 closing_time 类,因此当您从中选择时,此代码将不会运行。它还使用该类查找要更新的其他选择。

7 年前
回复了 Barmar 创建的主题 » jquery函数不使用Ajax返回/呈现的页面[重复]

这是一个 纯JavaScript 没有任何库或插件的解决方案:

document.addEventListener('click', function (e) {
    if (hasClass(e.target, 'bu')) {
        // .bu clicked
        // Do your thing
    } else if (hasClass(e.target, 'test')) {
        // .test clicked
        // Do your other thing
    }
}, false);

哪里 hasClass

function hasClass(elem, className) {
    return elem.className.split(' ').indexOf(className) > -1;
}

Live demo

信用卡给了戴夫和西米·维达斯

使用更现代的JS, 哈斯class 可以实现为:

function hasClass(elem, className) {
    return elem.classList.contains(className);
}
5 年前
回复了 Barmar 创建的主题 » mysql inner join-如何使用join子句中第一个表列的值

SELECT r.title, innerquery.event_time, r.number_of_seats_max, 
        r.number_of_seats_max - innerquery.num_persons_booked AS free_seats_left,
        innerquery.num_persons_booked
FROM restaurants r
INNER JOIN(
    select 
        restaurant_id,
        event_time,
        SUM(number_of_persons) as num_persons_booked
    from bookings
    WHERE event_date = '2019-07-18'
    group by event_time,restaurant_id
) as innerquery
     ON innerquery.restaurant_id = r.id
ORDER BY free_seats_left DESC

event_time SELECT